首页 > 解决方案 > 在弹性搜索中使用 query_string 忽略“AND”、“OR”结构并进行字面搜索

问题描述

在 elasticsearch 中,可以执行以下查询:

GET /_search
    {
      "query": {
        "query_string": {
          "query": "(apple) OR (banana)",
        }
      }
    }

这将导致所有文档的任何字段的值为“apple”或“banana”。我正在寻找一种方法来防止用户在搜索框中编写诸如“(苹果)或(香蕉)”之类的查询。这应该转换为对“(apple) OR (banana)”的文字搜索(因此返回值设置为“(apple) OR (banana)”的任何文档)。最好的方法是什么?

为了提供更多上下文:选择“query_string”是为了能够使用通配符对整个文档执行“包含”查询。

先感谢您!

[编辑]更清楚一点:示例:

如果用户搜索“(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)\""
            }
          }
    }

标签: elasticsearchquery-string

解决方案


添加带有索引数据、搜索查询和搜索结果的工作示例

指数数据:

{ "snack": "apple" }

 {"snack": "banana"}

{"snack": "(apple) OR (banana)"}

搜索查询:

{
  "query": {
    "query_string": {
      "query": "\\(apple\\) OR \\(banana\\)"
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "stof_64352271",
        "_type": "_doc",
        "_id": "1",
        "_score": 4.0350027,
        "_source": {
          "snack": "(apple) OR (banana)"
        }
      }
    ]

推荐阅读