2

我正在尝试为大型项目选择搜索工具,我很想知道 Solr 或 ElasticSearch 是否支持此用例。

我的客户有兴趣进行相对复杂的布尔搜索。必须进行的一项搜索是能够对带有词根扩展符的短语进行邻近搜索。

例如,假设用户搜索包含以下短语的文档:“可爱的狗被邪恶的浣熊攻击”

我希望用户能够在“dog”的 5 个单词内搜索“evil rac*”并返回包含上述句子的文档。理想情况下,查询应该类似于:

(“邪恶的 rac*”狗)~5

到目前为止,我发现的唯一可以做我正在寻找的搜索工具是 dtSearch。dtSearch 的查询将是带有 5 只狗的“evil rac*”,这很好。我宁愿使用 Solr 或 ElasticSearch 之类的开源工具(尤其是 websolr 或 bonsai.io 之类的托管解决方案)。任何建议将不胜感激。

4

3 回答 3

2

使用自定义查询解析器在技术上当然可以做到这一点,但是 solr 中的默认、dismax 等解析器似乎不支持这一点。关于此有一个古老且未解决的问题:https ://issues.apache.org/jira/browse/SOLR-1604 。

ElasticSearch 只支持 JSON 查询构建器,但似乎短语式查询支持仅适用于“span_term”,它们只是简单的单词。

有人说默认查询解析器在不久的将来会变得更加聪明。

于 2013-04-08T18:25:28.553 回答
1

在技​​术上绝对可行,但在 Lucene 中尚未得到支持。Lucene 中存在一些支持“复杂短语”行为的未解决问题,这似乎针对 Lucene 4.3:

LUCENE-1486 — 默认 QueryParser 的扩展,它覆盖 PhraseQueries 的解析以允许更复杂的语法,例如短语查询中的通配符。

我没有在他们的示例中看到您的特定查询结构,但这绝对比今天可用的更接近。

回顾一下:理论上可行,截至 2013 年 4 月和 Lucene 4.2.1 的语法不支持。

(向我的商业伙伴凯尔(Kyle)致敬,寻求帮助。)

于 2013-04-08T18:12:20.900 回答
0

这是可能的,但...

1) 首先,检查http://wiki.apache.org/solr/SurroundQueryParser ( http://searchhub.org/2009/02/22/exploring-query-parsers/ ) 是否有环绕查询解析器。这几乎正​​是您想要的。然而,人们声称(至少在某些地方)它支持短语查询,但事实并非如此(目前)。

2)所以你必须实现短语接近。一个(讨厌的)黑客是更新 DistanceQuery::getSpanNearQuery (在 lucene/queryparser/.../DistanceQuery.java 中的 solr 4.2.1 中的第 78 行)

while (sqi.hasNext()) {
  SpanNearClauseFactory sncf = new SpanNearClauseFactory(reader, fieldName, qf);

  // HACK starts here 
  DistanceSubQuery dsq = ((DistanceSubQuery)sqi.next());
  try {
    if ( ((SrndTermQuery)dsq).getTermText().contains( " " ) ) {
      String term_text = ((SrndTermQuery)dsq).getTermText();
      String[] tokens = term_text.split("\\s+");
      SpanQuery[] span_queries = new SpanQuery[tokens.length];
      for ( int i = 0; i < tokens.length; ++i ) {
        span_queries[i] = new SpanTermQuery( new Term(fieldName, tokens[i]) );
      }
      spanClauses[qi] = new SpanNearQuery( span_queries, 0, true);
      qi++;
      continue;
    }
  }catch( Exception ex ){
  }
  // HACK ends here 

  dsq.addSpanQueries(sncf);

3) 请注意,没有对数据进行预处理,因此如果您使用词干提取,则必须搜索准确的单词,例如 select?q={!surround df=text}"we defin" 11w "descend" will match " "" 我们定义了一组按降序排列的单词 """

于 2013-04-30T17:46:06.533 回答