感谢您阅读此问题。
我在我的应用程序中使用Solr作为搜索引擎。
当用户使用“java设计模式”进行搜索时。我们希望Solr返回的文档包含“java设计模式”而不是“java模式设计模式”或“java模式设计”......文档中的术语被索引:“design”,“patterns”,“java”......其他术语
我该如何实现?。
谢谢,
答案 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();
}