在Solr中正确搜索

时间:2012-07-09 03:51:36

标签: solr lucene

感谢您阅读此问题。

我在我的应用程序中使用Solr作为搜索引擎。

当用户使用“java设计模式”进行搜索时。我们希望Solr返回的文档包含“java设计模式”而不是“java模式设计模式”或“java模式设计”......文档中的术语被索引:“design”,“patterns”,“java”......其他术语

我该如何实现?。

谢谢,

3 个答案:

答案 0 :(得分:2)

您需要查看SpanNearQuery,这有助于将条款设置为与搜索相同的顺序。

  

SpanNearQuery将在一个内部找到一些SpanQuerys   给定距离。您可以指定跨度必须   按指定顺序排列,或不应考虑该顺序。   这些SpanQuerys可以是任意数量的TermQuerys,其他   SpanNearQuerys,或下面提到的其他SpanQuerys之一。您   可以任意嵌套,例如SpanNearQuerys可以包含其他   SpanNearQuerys还包含其他SpanNearQuerys等。

有一个SurroundQueryParser可以帮助您创建这些查询,但尚未发布。

您可以通过修改Dismax或Edismax Parsers来创建一个新的Parser来创建Span查询,而不是Phrase Queries,使用0 slop。

答案 1 :(得分:2)

您可以使用PhraseQuery。在双引号之间发送查询将返回完全匹配的结果。

Solr FAQ页面中还有一个问题,其中解释了How to search one term near another.

答案 2 :(得分:0)

诀窍是空格应该替换为\以避免它

示例: 如果我们用typeOfChange:*Cavity Ids*搜索(它不会返回任何内容) 但是如果我们使用pattern typeOfChange:*Cavity\ Ids*(它将返回数据)

可以提供帮助的是:

ClientUtils.escapeQueryChars(value.toString())

它的实施

 public static String escapeQueryChars(String s) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
      char c = s.charAt(i);
      // These characters are part of the query syntax and must be escaped
      if (c == '\\' || c == '+' || c == '-' || c == '!'  || c == '(' || c == ')' || c == ':'
        || c == '^' || c == '[' || c == ']' || c == '\"' || c == '{' || c == '}' || c == '~'
        || c == '*' || c == '?' || c == '|' || c == '&'  || c == ';' || c == '/'
        || Character.isWhitespace(c)) {
        sb.append('\\');
      }
      sb.append(c);
    }
    return sb.toString();
  }