whoosh 1.x发行说明

Whoosh 1.8

whoosh 1.8.3包含重要的错误修复和新功能。感谢所有邮件列表和bitback用户的帮助!

固定不良 Collector 结果对象的docset与实际结果不匹配的错误。

现在可以将一系列对象传递到中的关键字参数 add_documentupdate_document (目前,这不适用于 update_document )这对于非文本字段很有用,例如 DATETIMENUMERIC ,允许您为文档编制多个日期/数字的索引::

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 引发异常,但仍可以从收集器中检索部分结果。见 timelimitgreedy 中的参数 whoosh.searching.Collector 文档。

增加了设置的能力 whoosh.analysis.StemFilter 使用无限缓存。这对于一次成批索引很有用(请参见 Tips for speeding up batch indexing

这个 normalize() 方法 AndOr 现在,查询合并重叠的范围查询以获得更高效的查询。

查询对象现在有 __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.DoubleMetaphoneFilterwhoosh.analysis.SubstitutionFilterwhoosh.analysis.ShingleFilter .

补充 whoosh.qparser.CopyFieldPlugin .

补充 whoosh.query.Otherwise .

在查询解析器中对运算符(如“或”、“和”、“非”等)进行一般化解析,以便于添加新的运算符。希望在将来的版本中为此添加更好的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 对象不再表示对象实例化时索引的快照。相反,它总是抽象地表示索引。 SearcherIndexReader 从中获取的对象 Index 对象仍然表示创建索引时的索引。

因为 Index 对象不再表示特定版本的索引,例如 up_to_daterefresh 已从其接口中删除。搜索者对象现在有 last_modified()up_to_date()refresh() 类似于以前的方法 Index .

文档删除和字段添加/删除方法 Index 对象现在在后台创建一个编写器来完成每个调用。这意味着它们会立即写入索引,因此您无需调用 commitIndex . 此外,如果您需要多次调用它们来创建自己的作者,则速度会更快:

# 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_MERGEwhoosh.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 其初始值设定项的参数。使用 StopFiltermaxsize 他们的初始值设定项中的参数现在也是。

的接口 whoosh.writing.AsyncWriter 改变了。

误码率

  • 由于文件后端现在写入64位磁盘指针和字段名而不是数字,因此与以前的版本相比,磁盘上索引的大小将增大。

  • 单元测试不应该再留下目录和文件。