1

例如: Lucene 文档中有一个列“ 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 命中

有什么建议吗?谢谢!

4

2 回答 2

1

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

  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放入PrefixQueriesBooleanQuery

编辑:例如像这样:

BooleanQuery booleanQuery = new BooleanQuery();

for(String token : tokens) {        
    booleanQuery.add(new PrefixQuery(new Term(fieldName, token)),  Occur.MUST);
}
于 2012-12-17T10:09:48.253 回答
0

索引时尝试过 Ngram 或 EdgeNgram?

http://lucene.apache.org/core/old_versioned_docs/versions/2_9_0/api/all/org/apache/lucene/analysis/ngram/NGramTokenizer.html

于 2012-12-17T09:32:28.977 回答