为什么 Solr ClientUtils::escapeQueryChars 转义空格

Why does Solr ClientUtils::escapeQueryChars escape spaces

Solr 查询有一些需要转义的特殊字符,+-&|!(){}[]^"~*?:/

SolrJ 提供了一个实用方法 ClientUtils::escapeQueryChars 可以转义更多字符,包括 ;white spaces

当搜索词包含 space 时,它导致我的应用程序出现错误,例如 foo bar,它被 ClientUtils::escapeQueryChars 变成了 foo\ bar。我的解决方案是拆分搜索词,转义每个词并用 ANDOR 加入它们。

但是为了处理 handle space 而编写额外的代码仍然很痛苦。

space; 也被此实用程序方法转义是否有任何特殊原因?

在 Solr(和 Lucene)中,字符在查询语法中可能具有不同的含义,具体取决于您使用的query parser(例如标准、dismax、edismax 等)。

因此,何时以及如何转义取决于您使用的查询解析器以及您尝试执行的查询。我知道这作为答案似乎过于宽泛,但我将添加一个示例以使事情更清楚。

例如,让我们尝试使用 edismax 作为查询解析器,并有一个文档的字段名为 tv_display,类型为 string

如果你写:

http://localhost:8983/solr/buybox/select?q=tv_display:Full HD

edismax 将转换 +tv_display:Full +tv_display:HD 中的查询。

这样你就永远不会找到 tv_displayFull HD 的文档,而是 tv_displayFull and/or HD(and/or 取决于您的 mm 配置)。

ClientUtils::escapeQueryCharsFull HD 转换为 Full\ HD:

http://localhost:8983/solr/buybox/select?q=tv_display:Full\ HD

所以 edismax 将整个字符串作为一个标记,只有这样才能返回 tv_display 具有 Full HD 的所有文档。

总之ClientUtils::escapeQueryChars 转义所有可能被查询解析​​器误解的字符(包括空格和分号)。