感谢您阅读此问题。
我在我的应用程序中使用 Solr 作为搜索引擎。
当用户使用“java 设计模式”进行搜索时。我们希望 Solr 返回的文档完全包含“java 设计模式”,而不是“设计模式 java”或“java 模式设计”......文档中的术语被索引:“设计”、“模式”、“java”......其他术语.
我该如何实现这个?
谢谢,
您需要检查SpanNearQuery这将有助于将术语设置为与搜索的顺序相同。
SpanNearQuery 将寻找在给定距离内的多个 SpanQuery。您可以指定跨度必须按指定的顺序出现,或者不应考虑该顺序。这些 SpanQuery 可以是任意数量的 TermQuery、其他 SpanNearQuery 或下面提到的其他 SpanQuery 之一。您可以任意嵌套,例如 SpanNearQuerys 可以包含其他 SpanNearQuerys,其中还包含其他 SpanNearQuerys 等。
有一个SurroundQueryParser可以帮助您创建这些查询,但它尚未发布。
您可以通过修改 Dismax 或 Edismax 解析器来创建一个新的解析器来创建跨度查询,而不是短语查询,并且 0 斜率。
您可以使用PhraseQuery。在双引号之间发送查询将返回完全匹配的结果。
Solr FAQ 页面中还有一个问题,它解释了如何在一个术语附近搜索一个术语。
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();
}