【问题标题】:Multiple words query in LuceneLucene 中的多词查询
【发布时间】:2012-12-17 08:47:51
【问题描述】:

例如: 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 次命中

有什么建议吗?谢谢!

【问题讨论】:

  • 你试过什么?你能显示一些代码 sn-ps 吗?这将有助于我们更好地了解您的问题。
  • 您是否尝试过使用 org.apache.lucene.queryParser.QueryParse 来解析查询字符串,例如“description: hello AND description: f*”?
  • @pabrantes "description: hello AND description: f*" 不是预期的,我想要 "hello" 后跟 "f"。
  • @TheDarkKnight 添加了三个案例。

标签: java lucene


【解决方案1】:

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

  1. 使用您的分析器标记输入字符串,它将您的搜索文本“hello f”拆分为“hello”和“f”:

    TokenStream tokenStream = analyzer.tokenStream(null, new StringReader(searchText)); CharTermAttribute termAttribute = tokenStream.getAttribute(CharTermAttribute.class);

    列表标记 = new ArrayList(); 而 (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);
}

【讨论】:

  • 谢谢亚当!我已经使用您的第一种分析方法。但第二种方式不是预期的方式。
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多