情况是这样的。
Lucene索引文档中有一个名为“content”的字段,每个文档中的“content”有两个值,例如:
- 文档1-内容:“天然气和石油”、“能源”
- 文档2-内容:“天然气”、“石油”
当我搜索“content:(+gas +oil)"时,document 1和document 2都被返回,这是意料之中的。
下一步,我想循环每个内容值以获得点击数,
- “天然气和石油”
- “能源”
- “气体”
- “石油”
我用了荧光笔,目的是让“gasandoil”被返回,因为只有这一个“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
}
}
先谢谢你
1条答案
按热度按时间lmvvr0a81#
Highlighter是基于term的,所以解决这个问题的最好方法是重建索引,并以不同的方式组织它,即:
因此,当搜索“content:(+gas +oil)"时,只会命中document1。