为什么 Solr ClientUtils::escapeQueryChars 转义空格
Why does Solr ClientUtils::escapeQueryChars escape spaces
Solr 查询有一些需要转义的特殊字符,+-&|!(){}[]^"~*?:/。
SolrJ 提供了一个实用方法 ClientUtils::escapeQueryChars 可以转义更多字符,包括 ;
和 white spaces
。
当搜索词包含 space 时,它导致我的应用程序出现错误,例如 foo bar
,它被 ClientUtils::escapeQueryChars
变成了 foo\ bar
。我的解决方案是拆分搜索词,转义每个词并用 AND
或 OR
加入它们。
但是为了处理 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_display
是 Full HD
的文档,而是 tv_display
是 Full
and/or HD
(and/or 取决于您的 mm
配置)。
ClientUtils::escapeQueryChars
将 Full HD
转换为 Full\ HD
:
http://localhost:8983/solr/buybox/select?q=tv_display:Full\ HD
所以 edismax 将整个字符串作为一个标记,只有这样才能返回 tv_display
具有 Full HD
的所有文档。
总之ClientUtils::escapeQueryChars
转义所有可能被查询解析器误解的字符(包括空格和分号)。
Solr 查询有一些需要转义的特殊字符,+-&|!(){}[]^"~*?:/。
SolrJ 提供了一个实用方法 ClientUtils::escapeQueryChars 可以转义更多字符,包括 ;
和 white spaces
。
当搜索词包含 space 时,它导致我的应用程序出现错误,例如 foo bar
,它被 ClientUtils::escapeQueryChars
变成了 foo\ bar
。我的解决方案是拆分搜索词,转义每个词并用 AND
或 OR
加入它们。
但是为了处理 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_display
是 Full HD
的文档,而是 tv_display
是 Full
and/or HD
(and/or 取决于您的 mm
配置)。
ClientUtils::escapeQueryChars
将 Full HD
转换为 Full\ HD
:
http://localhost:8983/solr/buybox/select?q=tv_display:Full\ HD
所以 edismax 将整个字符串作为一个标记,只有这样才能返回 tv_display
具有 Full HD
的所有文档。
总之ClientUtils::escapeQueryChars
转义所有可能被查询解析器误解的字符(包括空格和分号)。