Elasticsearch - EdgeNgram + highlight + term_vector =错误的亮点

时间:2012-07-03 02:19:03

标签: java search lucene elasticsearch n-gram

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

文档中包含text =" CouchDB"

当我搜索" couc"

我的亮点在于" cou"而不是" couc"


似乎我的亮点仅在于最小匹配令牌" cou"虽然我希望得到确切的令牌(如果可能)或至少找到最长的令牌。

在没有使用term_vector = with_positions_offsets

分析文本的情况下,它可以正常工作

删除term_vector = with_positions_offsets以获得性能的影响是什么?

2 个答案:

答案 0 :(得分:8)

为特定字段设置term_vector=with_positions_offsets时,表示您为该字段存储每个文档的术语向量。

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

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

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

关于ngram字段,所描述的行为很奇怪,因为快速矢量突出显示器应该对ngram字段有更好的支持,因此我期望完全相反的结果。

答案 1 :(得分:4)

我知道这个问题很旧,但尚未解答完全

还有另一种选择可以产生这种奇怪的行为:

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