1

感谢您阅读此问题。

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

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

我该如何实现这个?

谢谢,

4

3 回答 3

2

您需要检查SpanNearQuery这将有助于将术语设置为与搜索的顺序相同。

SpanNearQuery 将寻找在给定距离内的多个 SpanQuery。您可以指定跨度必须按指定的顺序出现,或者不应考虑该顺序。这些 SpanQuery 可以是任意数量的 TermQuery、其他 SpanNearQuery 或下面提到的其他 SpanQuery 之一。您可以任意嵌套,例如 SpanNearQuerys 可以包含其他 SpanNearQuerys,其中还包含其他 SpanNearQuerys 等。

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

您可以通过修改 Dismax 或 Edismax 解析器来创建一个新的解析器来创建跨度查询,而不是短语查询,并且 0 斜率。

于 2012-07-09T06:50:56.820 回答
2

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

Solr FAQ 页面中还有一个问题,它解释了如何在一个术语附近搜索一个术语。

于 2012-07-09T07:05:50.620 回答
0

The trick is that spaces should replaces with\ to avoid it

Example: if we search with typeOfChange:*Cavity Ids* (it will not return anything) but if we use the pattern typeOfChange:*Cavity\ Ids* (it will return data)

What can help is:

ClientUtils.escapeQueryChars(value.toString())

And It's implementation:

 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();
  }
于 2015-07-29T09:06:27.713 回答