【发布时间】:2020-10-14 22:56:44
【问题描述】:
在 elasticsearch 中可以执行以下查询:
GET /_search
{
"query": {
"query_string": {
"query": "(apple) OR (banana)",
}
}
}
这会导致所有文档的任何字段都具有值“apple”或“banana”。我正在寻找一种方法来防止用户在搜索框中编写诸如“(苹果)或(香蕉)”之类的查询。 这应该转换为对“(apple) OR (banana)”的文字搜索(因此返回值设置为“(apple) OR (banana)”的任何文档)。最好的方法是什么?
为了提供更多上下文:选择“query_string”是为了能够使用通配符对整个文档执行“包含”查询。
提前谢谢你!
[编辑] 更清楚一点: 示例:
- 文档 1:{“小吃”:“苹果”}
- 文档 2:{"snack": "banana"}
- 文档 3:{"snack": "(apple) OR (banana)"}
如果用户搜索 "(apple) OR (banana)",这通常会导致 Doc 1 和 Doc 2,但我希望它只与 Doc 3 匹配。
感谢@Bhavya 和@TreffnonX 解决: 摘要:采用@Bhavya 解决方案,但将我的搜索字符串用额外的双引号括起来:
GET _search
{
"query": {
"query_string": {
"query": "\"\\(apple\\) OR \\(banana\\)\""
}
}
}
或
GET _search
{
"query": {
"query_string": {
"query": "\"(apple) OR (banana)\""
}
}
}
【问题讨论】:
-
你的问题不是很清楚。你能解释一下应该转换为文字搜索是什么意思吗?
-
@Bhavya 抱歉:'D,我的意思是搜索“(apple) OR (banana)”将返回具有精确值“(apple) OR (banana)”的值的结果(所以没有查询语言的解释)。所以结果不会包含与苹果或香蕉匹配的值。示例: - 文档 1:{ "snack": "apple" } - 文档 2:{"snack": "banana"} - 文档 3:{"snack": "(apple) OR (banana)"} 搜索“ (apple) OR (banana)" 通常会生成 Doc 1 和 Doc 2,但我希望它只与 Doc 3 匹配。
-
您想转义搜索输入并仅按字面搜索输入的字符序列吗?以下字符需要用反斜杠
+ - & | ! ( ) { } [ ] ^ " ~ * ? : \转义。 -
@TreffnonX 我也这么认为,但这会导致错误:“无法识别的字符转义 '(' (code 40)\n at [Source: (org.elasticsearch.common.bytes.AbstractBytesReference$ MarkSupportingStreamInputWrapper);行:4,列:19]"
-
您很可能正在使用其他语言创建 json。您可能还需要转义反斜杠本身:
"\\("(例如在 Java 中)
标签: elasticsearch query-string