在elasticsearch中忽略带有查询字符串的'and'、'or'结构,并按字面搜索

zqdjd7g9  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(378)

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

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

这将导致所有文档都具有值为“apple”或“banana”的任何字段。我正在寻找一种方法来防止用户在搜索框中编写“(apple)或(banana)”之类的查询。这应该转换为对“(apple)或(banana)”的文字搜索(因此返回任何值设置为“(apple)或(banana)”的文档)。最好的办法是什么?
为了提供更多的上下文,选择“query\u string”可以使用通配符对整个文档执行“contains”查询。
提前谢谢!
[编辑]更清楚一点:示例:
文档1:{“零食”:“苹果”}
文档2:{“零食”:“香蕉”}
文档3:{“零食”:(苹果)或(香蕉)}
如果用户搜索“(apple)或(banana)”,通常会得到doc1和doc2,但我希望它只与doc3匹配。
多亏了@bhavya和@treffnonx:summary:采用了@bhavya解决方案,但将我的搜索字符串用额外的双引号括起来:

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

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

hgc7kmma1#

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

{ "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)"
        }
      }
    ]

相关问题