7

当我使用带有 edgengram (min=3, max=7, front) + term_vector=with_positions_offsets 的分析器时

带有文本的文档 = "CouchDB"

当我搜索“couc”时

我的亮点是“cou”而不是“couc”


看来我的亮点仅在最小匹配令牌“cou”上,而我希望在确切的令牌上(如果可能)或至少在找到的最长令牌上。

无需使用 term_vector=with_positions_offsets 分析文本即可正常工作

删除 term_vector=with_positions_offsets 对性能有什么影响?

4

2 回答 2

9

当您term_vector=with_positions_offsets为特定字段设置时,这意味着您正在为该字段存储每个文档的术语向量。

在高亮方面,术语向量允许您使用 lucene 快速向量高亮,它比标准高亮更快。原因是标准荧光笔没有任何快速突出显示的方法,因为索引不包含足够的信息(位置和偏移量)。它只能重新分析字段内容,截取偏移和位置,并根据该信息进行突出显示。这可能需要相当长的时间,尤其是对于长文本字段。

使用术语向量,您确实有足够的信息,并且不需要重新分析文本。不利的一面是指数的规模,这将显着增加。我必须补充一点,因为 Lucene 4.2 术语向量被更好地压缩并以优化的方式存储。还有新的 PostingsHighlighter 基于在发布列表中存储偏移量的能力,这需要更少的空间。

elasticsearch 根据可用信息自动使用最佳方式进行突出显示。如果存储了术语向量,它将使用快速向量荧光笔,否则使用标准荧光笔。在没有术语向量的情况下重新索引后,将使用标准荧光笔进行突出显示。它会更慢,但索引会更小。

关于 ngram 字段,所描述的行为很奇怪,因为快速矢量荧光笔应该对 ngram 字段有更好的支持,因此我希望得到完全相反的结果。

于 2013-03-29T14:25:01.857 回答
4

我知道这个问题很老,但还没有完全回答:

还有另一种选择可以屈服于这种奇怪的行为:

如果您不希望文档的其他结果影响当前文档突出显示,则必须设置require_field_match为,请参阅: http ://www.elasticsearch.org/guide/reference/api/search/highlighting/true

于 2013-04-16T10:45:28.063 回答