例如:
Lucene文档中有一列“ description ”。假设“ description ”的内容为[hello foo bar
]。我想要一个查询[hello f
],然后应该点击该文档,[hello ff
]
或者[hello b
]不应该被击中。
我使用编程方式创建Query
,例如PrefixQuery
,TermQuery
已添加到BooleanQuery
,但它们无法按预期工作。使用StandardAnalyzer
。
测试用例:
a):new PrefixQuery(new Term("description", "hello f"))
- > 0点击
b):PhraseQuery query = new PhraseQuery();
query.add( new Term("description", "hello f*") )
- > 0点击
c):PhraseQuery query = new PhraseQuery();
query.add( new Term("description", "hello f") )
- > 0点击
有什么建议吗?谢谢!
答案 0 :(得分:1)
它不起作用,因为您将多个术语传递给一个Term
对象。如果您希望所有搜索词都找到前缀,则需要:
使用您的分析器对输入字符串进行标记,它会将您的搜索文本“hello f”拆分为“hello”和“f”:
TokenStream tokenStream = analyzer.tokenStream(null,new StringReader(searchText)); CharTermAttribute termAttribute = tokenStream.getAttribute(CharTermAttribute.class);
列出标记= new ArrayList(); while(tokenStream.incrementToken()){ tokens.add(termAttribute.toString()); }
将每个令牌放入Term
对象,而PrefixQuery
对象需要放入PrefixQueries
,所有BooleanQuery
放入BooleanQuery booleanQuery = new BooleanQuery();
for(String token : tokens) {
booleanQuery.add(new PrefixQuery(new Term(fieldName, token)), Occur.MUST);
}
编辑:例如:
{{1}}
答案 1 :(得分:0)