whoosh 1.x发行说明¶
Whoosh 1.8¶
whoosh 1.8.3包含重要的错误修复和新功能。感谢所有邮件列表和bitback用户的帮助!
固定不良 Collector
结果对象的docset与实际结果不匹配的错误。
现在可以将一系列对象传递到中的关键字参数 add_document
和 update_document
(目前,这不适用于 update_document
)这对于非文本字段很有用,例如 DATETIME
和 NUMERIC
,允许您为文档编制多个日期/数字的索引::
writer.add_document(shoe=u"Saucony Kinvara", sizes=[10.0, 9.5, 12])
此版本恢复为对哈希文件使用cdb hash函数,而不是对python的 hash()
因为后者不打算存储在外部。此更改保持与旧文件的向后兼容性。
这个 Searcher.search
方法现在采用 mask
关键字参数。这与 filter
争论。何处 filter
指定可以在结果中显示的文档集, mask
指定一组不能出现在结果中的文档。
修复了中的性能问题 Searcher.more_like
. 此方法现在还需要 filter
关键字参数类似 Searcher.search
.
改进的文档。
Whoosh 1.8¶
whoosh 1.8.2修复了一些错误,包括搜索者中输入错误的签名,更像是收集器中的一个错误错误,它可能会在给定参数的情况下破坏结果的顺序。
Whoosh 1.8¶
whoosh 1.8.1包括一些最近的错误修复/改进:
listmacher.skip_to_quality()未返回整数,导致“none+in t”错误。
修复了谷歌应用引擎存储对象中的锁定和memcache同步错误。
多场Plugin在小组中工作不正常。
或和的二元匹配树现在使用类似哈夫曼的算法生成,而不是完全平衡。这显著提高了速度,因为需要向上/向下传递的信息更少。
Whoosh1.8¶
此版本将whoosh源代码保留在简化的bsd(a.k.a.“two-clause”或“freebsd”)许可下。有关详细信息,请参阅license.txt。
Whoosh1.7.7¶
设置文本字段来存储术语向量现在要容易得多。不必将实例化的whoosh.formats.format对象传递给vector=keyword参数,您可以传递true以自动使用与反向索引相同的格式和分析器。或者,您可以传递一个格式子类,whoosh将为您实例化它。
For example, to store term vectors using the same settings as the inverted index (Positions format and StandardAnalyzer):
from whoosh.fields import Schema, TEXT
schema = Schema(content=TEXT(vector=True))
存储使用与反向索引相同的分析器的术语向量(默认情况下为StandardAnalyzer),但只存储术语频率:
from whoosh.formats import Frequency
schema = Schema(content=TEXT(vector=Frequency))
请注意,目前在whoosh中唯一使用术语vectors的地方是关键字提取/更像这样,但是它们对于使用自定义代码的专家用户很有用。
补充 whoosh.searching.Searcher.more_like()
和 whoosh.searching.Hit.more_like_this()
方法,作为自己进行关键字提取的快捷方式。返回结果对象。
只要已经安装好了,python setup.py test就可以再次工作。
这个 whoosh.searching.Searcher.sort_query_using()
方法允许使用任意函数对与给定查询匹配的文档进行排序。注意,像使用Sorter对象进行“复杂”搜索一样,这在大型多段索引上可能很慢。
Whoosh1.7¶
您可以再次对搜索结果执行复杂的排序(即,对某些字段升序,某些字段降序的排序)。
你仍然可以使用 sortedby
关键字参数 whoosh.searching.Searcher.search()
要进行简单排序(所有字段按相同方向排序),或者可以使用新的 Sorter
要执行简单或复杂排序的类::
searcher = myindex.searcher()
sorter = searcher.sorter()
# Sort first by the group field, ascending
sorter.add_field("group")
# Then by the price field, descending
sorter.add_field("price", reverse=True)
# Get the Results
results = sorter.sort_query(myquery)
有关 Sorter
类以获取更多信息。记住,在大型索引上复杂的排序会慢得多,因为它们不能使用每段字段缓存。
现在,您可以使用 whoosh.searching.Hit.highlights()
::
results = searcher.search(myquery, limit=20)
for hit in results:
print hit["title"]
print hit.highlights("content")
见 whoosh.searching.Hit.highlights()
更多信息。
添加了过滤搜索结果的功能,以便只返回结果集、一组docnum或匹配查询中的点击。过滤器缓存在搜索器上。
#在以前的结果中搜索newresults=searcher.search(newquery,filter=oldresults)
#在“基础”章节搜索结果=searcher.search(userquery,filter=query.term(“章节”,“基础”))
现在可以指定搜索的时间限制。如果搜索未在给定时间内完成,则 whoosh.searching.TimeLimit
引发异常,但仍可以从收集器中检索部分结果。见 timelimit
和 greedy
中的参数 whoosh.searching.Collector
文档。
增加了设置的能力 whoosh.analysis.StemFilter
使用无限缓存。这对于一次成批索引很有用(请参见 Tips for speeding up batch indexing )
这个 normalize()
方法 And
和 Or
现在,查询合并重叠的范围查询以获得更高效的查询。
查询对象现在有 __hash__
方法允许它们用作字典键。
Highlight模块的API略有变化。模块中的大多数函数都已转换为类。但是,大多数旧代码仍然可以工作。这个 NullFragmeter
现在叫做 WholeFragmenter
,但旧名称仍可用作别名。
修复了multipool,因此它不会用作业文件填充临时目录。
修正了短语查询对象不使用其增强因子的错误。
修正了一个错误,即未正确解析左括号后的字段名。这种变化改变了某些解析“角落案例”的语义(例如 a:b:c:d
)
Whoosh1.6¶
这个 whoosh.writing.BatchWriter
现在调用类 whoosh.writing.BufferedWriter
. 它和旧的相似 BatchWriter
类,但允许您搜索和更新缓冲文档以及已刷新到磁盘的文档::
writer = writing.BufferedWriter(myindex)
# You can update (replace) documents in RAM without having to commit them
# to disk
writer.add_document(path="/a", text="Hi there")
writer.update_document(path="/a", text="Hello there")
# Search committed and uncommited documents by getting a searcher from the
# writer instead of the index
searcher = writer.searcher()
(为了向后兼容,BatchWriter仍可用作别名。)
这个 whoosh.qparser.QueryParser
初始化方法现在需要一个模式作为第二个参数。以前的默认设置是创建一个 QueryParser
没有模式,这让人困惑:
qp = qparser.QueryParser("content", myindex.schema)
这个 whoosh.searching.Searcher.search()
方法现在采用 scored
关键字。如果你搜索 scored=False
结果将按“自然”顺序排列(文档添加到索引的顺序)。当您不需要计分结果,但需要结果对象的便利性时,这很有用。
增加了 whoosh.qparser.GtLtPlugin
Parser插件,允许将大于/小于作为范围的可选语法:
count:>100 tag:<=zebra date:>='29 march 2001'
添加了以声明方式定义模式的功能,类似于Django模型:
from whoosh import index
from whoosh.fields import SchemaClass, ID, KEYWORD, STORED, TEXT
class MySchema(SchemaClass):
uuid = ID(stored=True, unique=True)
path = STORED
tags = KEYWORD(stored=True)
content = TEXT
index.create_in("indexdir", MySchema)
Whoosh 1.6.2: Added whoosh.searching.TermTrackingCollector
它跟踪查询的哪个部分匹配最终结果中的哪些文档。
替换了中的未绑定缓存 whoosh.analysis.StemFilter
有限制的LRU(最近使用的最少)缓存。这将使词干分析稍微慢一点,但防止它随着时间消耗过多的内存。
添加简单 whoosh.analysis.PyStemmerFilter
当安装py stemmer库时可以使用:
ana = RegexTokenizer() | PyStemmerFilter("spanish")
内存使用率的估计 limitmb
关键字参数 FileIndex.writer()
更准确,这将有助于使排序池的内存使用率接近限制。
这个 whoosh.ramdb
包已被删除并替换为单个 whoosh.ramindex
模块。
其他错误修复。
Whoosh1.5¶
注解
whoosh 1.5与以前的索引不兼容。必须使用whoosh 1.5重新创建现有索引。
修正了一个错误,即在不同的endian平台上不能移植日志。
新的通用字段缓存系统,使用每个读卡器缓存,以更快的排序和搜索结果方面,以及更快的多术语(如前缀和通配符)和范围查询,特别是对于大索引和/或多段索引。
更改了方面API。见 排序和分面 .
更快地存储和检索过账值。
每场增加 multitoken_query
属性来控制查询解析器如何处理一个“术语”,当分析该术语时,它将生成多个标记。默认值是`“first”,它丢弃除第一个令牌(前面的行为)之外的所有令牌。其他可能的值是“和”、“或”,或“短语”`。
补充 whoosh.analysis.DoubleMetaphoneFilter
, whoosh.analysis.SubstitutionFilter
和 whoosh.analysis.ShingleFilter
.
补充 whoosh.qparser.CopyFieldPlugin
.
在查询解析器中对运算符(如“或”、“和”、“非”等)进行一般化解析,以便于添加新的运算符。希望在将来的版本中为此添加更好的API。
切换数字和日期时间字段以使用更紧凑的磁盘上数字表示形式。
修正了当词干字符串“y”时porter2词干分析器中的错误。
向添加了方法 whoosh.searching.Hit
使它更像 dict.
短日志列表(默认情况下,单个日志)在术语文件中是内联的,而不是写入日志文件,以便更快地检索和节省磁盘空间。
Whoosh1.3¶
whoosh 1.3基于新的分层数字字段和dateparserplugin添加了一个更有效的datetime字段。见 Indexing and parsing dates/times .
Whoosh1.2¶
whoosh 1.2为数字字段添加了分层索引,从而使对数字字段的范围查询更快。
Whoosh1¶
Whoosh 1.0是一个重要的里程碑版本,它有着极大的改进性能和一些有用的新特性。
此版本的索引格式与以前版本的whoosh创建的索引不兼容. 您需要重新建立数据索引才能使用此版本。
数量级更快地搜索常用术语。现在,whoosh使用类似于xapian的优化来跳过阅读低得分的帖子。
更快的索引和使用多个处理器的能力(通过 multiprocessing
模块)加快索引。
灵活的模式:现在可以使用 whoosh.writing.IndexWriter.add_field()
和 whoosh.writing.IndexWriter.remove_field()
方法。
基于插件的新的手写查询解析器。与旧的基于pyparsing的解析器相比,它不那么脆弱,更健壮,更灵活,更容易修复/改进。
在磁盘格式上,现在使用64位磁盘指针,允许文件大于4GB。
新的 whoosh.searching.Facets
类根据可以表示为查询的任何条件(例如标记或价格范围)将结果高效地排序为方面。
新的 whoosh.writing.BatchWriter
类自动将单个 add_document
和/或 delete_document
调用,直到某个调用数或某个时间段过去,然后立即提交所有调用。
新的 whoosh.analysis.BiWordFilter
允许您创建双字索引字段,这是短语搜索的一种可能替代方法。
修正了一个错误,即文件可以在读卡器在线程情况下打开之前被删除。
新的 whoosh.analysis.NgramFilter
滤波器, whoosh.analysis.NgramWordAnalyzer
分析器,以及 whoosh.fields.NGRAMWORDS
字段类型允许从标记化文本中生成n-gram。
查询分析中的错误现在引发一个特定的 whoosh.qparse.QueryParserError
异常而不是一般异常。
以前,查询字符串 *
已优化为 whoosh.query.Every
query which matched every document. 现在 Every
查询只匹配具有给定字段索引项的文档,以便更好地匹配查询字符串的直观含义。 tag:*
应该做的。
新的 whoosh.searching.Searcher.key_terms_from_text()
方法允许从任意文本中提取关键字,而不是从索引中提取文档。
以前 whoosh.searching.Searcher.key_terms()
和 whoosh.searching.Results.key_terms()
方法要求给定的字段存储术语向量。如果存储给定的字段,它们现在也可以工作。他们将动态地将存储的字符串分析为术语向量。该字段必须仍被索引。
用户API更改¶
的默认值 limit
关键字参数 whoosh.searching.Searcher.search()
现在是 10
. 返回单个结果 Results
使用对象 limit=None
.
这个 Index
对象不再表示对象实例化时索引的快照。相反,它总是抽象地表示索引。 Searcher
和 IndexReader
从中获取的对象 Index
对象仍然表示创建索引时的索引。
因为 Index
对象不再表示特定版本的索引,例如 up_to_date
和 refresh
已从其接口中删除。搜索者对象现在有 last_modified()
, up_to_date()
和 refresh()
类似于以前的方法 Index
.
文档删除和字段添加/删除方法 Index
对象现在在后台创建一个编写器来完成每个调用。这意味着它们会立即写入索引,因此您无需调用 commit
上 Index
. 此外,如果您需要多次调用它们来创建自己的作者,则速度会更快:
# Don't do this
for id in my_list_of_ids_to_delete:
myindex.delete_by_term("id", id)
myindex.commit()
# Instead do this
writer = myindex.writer()
for id in my_list_of_ids_to_delete:
writer.delete_by_term("id", id)
writer.commit()
这个 postlimit
参数 Index.writer()
已更改为 postlimitmb
现在用兆字节而不是字节来表示:
writer = myindex.writer(postlimitmb=128)
而不是必须import whoosh.filedb.filewriting.NO_MERGE
或 whoosh.filedb.filewriting.OPTIMIZE
用作参数 commit()
,现在只需执行以下操作:
# Do not merge segments
writer.commit(merge=False)
# or
# Merge all segments
writer.commit(optimize=True)
这个 whoosh.postings
模块不见了。这个 whoosh.matching
模块包含用于发布列表读取器的类。
whoosh不再将字段名映射到数字以供内部使用或写入磁盘。任何接受字段号的低级方法现在都接受字段名。
使用 final()
方法现在必须设置 use_final
属性到 True
::
from whoosh.scoring import BM25F
class MyWeighting(BM25F):
use_final = True
def final(searcher, docnum, score):
return score + docnum * 10
这将禁用新的优化,强制whoosh为每个匹配的文档打分。
whoosh.writing.AsyncWriter
现在需要一个 whoosh.index.Index
对象作为其第一个参数,而不是可调用的。另外,要传递到索引的关键字参数 writer()
方法现在应作为字典使用 writerargs
关键字参数。
现在,whoosh使用近似值而不是精确值来存储每个文档字段长度。对于低数值,近似值是完全准确的,而高数值的近似值则不太准确。
这个 doc_field_length
搜索者和读者上的方法现在接受第二个参数,该参数表示如果给定的文档和字段没有长度(即字段没有得分或没有为给定的文档提供字段),则返回默认值。
这个 whoosh.analysis.StopFilter
现在有一个 maxsize
argument as well as a minsize
其初始值设定项的参数。使用 StopFilter
有 maxsize
他们的初始值设定项中的参数现在也是。
的接口 whoosh.writing.AsyncWriter
改变了。
误码率¶
由于文件后端现在写入64位磁盘指针和字段名而不是数字,因此与以前的版本相比,磁盘上索引的大小将增大。
单元测试不应该再留下目录和文件。