0

这是情况。

Lucene索引文档中有一个名为“content”的字段,每个文档中的“content”有两个值。例如:

  • document1 - 内容:“天然气和石油”、“能源”
  • document2 - 内容:“gas”、“oil”

当我搜索“content:(+gas +oil)”时,document1 和 document2 都会返回,这是预期的。

下一步,我想循环每个内容的命中值,

  • “天然气和石油”
  • “活力”
  • “气体”
  • “油”

我使用荧光笔,目的是返回“ gas and oil ”,因为只有这个“gas and oil”点击了这个查询“(+gas +oil)”。

但我实际上得到

  • 天然气石油

似乎查询在荧光笔上不起作用,所以当我使用查询“(+gas +oil)”或查询“(gas oil)”进行突出显示时,并没有太大区别。

我用错了荧光笔吗?有没有办法只得到“天然气石油”?

我使用的代码示例

for (final String value : values) {
    final QueryScorer scorer = new QueryScorer(query);
    final Highlighter highlighter = new Highlighter(scorer);
    highlighter.setTextFragmenter(new SimpleFragmenter(2000));
    final TokenStream tokenStream = analyzer.tokenStream(field, new StringReader(value));
    final CachingTokenFilter filter = new CachingTokenFilter(tokenStream);
    final String highlightedText = highlighter.getBestFragment(filter, value);
    if (StringUtils.isNotBlank(highlightedText)) {
      //TODO
    }
}

提前致谢

4

1 回答 1

0

Highlighter是基于term的,所以解决这个问题最好的办法就是重建索引,用不同的方式组织,即:

document1 - content: "gas and oil"
document2 - content: "energy"
document3 - content: "gas"
document4 - content: "oil"

因此,在搜索“content:(+gas +oil)”时,只会命中document1。

于 2022-02-13T22:51:45.647 回答