Lucene中的多个单词查询

时间:2012-12-17 08:47:51

标签: java lucene

例如: Lucene文档中有一列“ description ”。假设“ description ”的内容为[hello foo bar]。我想要一个查询[hello f],然后应该点击该文档,[hello ff] 或者[hello b]不应该被击中。

我使用编程方式创建Query,例如PrefixQueryTermQuery已添加到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点击

有什么建议吗?谢谢!

2 个答案:

答案 0 :(得分:1)

它不起作用,因为您将多个术语传递给一个Term对象。如果您希望所有搜索词都找到前缀,则需要:

  1. 使用您的分析器对输入字符串进行标记,它会将您的搜索文本“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()); }

  2. 将每个令牌放入Term对象,而PrefixQuery对象需要放入PrefixQueries,所有BooleanQuery放入BooleanQuery booleanQuery = new BooleanQuery(); for(String token : tokens) { booleanQuery.add(new PrefixQuery(new Term(fieldName, token)), Occur.MUST); }

  3. 编辑:例如:

    {{1}}

答案 1 :(得分:0)