【问题标题】:Ignore 'AND', 'OR' constructions with query_string in elastic search and do literally search在弹性搜索中使用 query_string 忽略“AND”、“OR”结构并进行字面搜索
【发布时间】: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


【解决方案1】:

添加一个包含索引数据、搜索查询和搜索结果的工作示例

索引数据:

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

【讨论】:

  • 不幸的是,"\(apple\) OR \(banana\)" 不能解决问题。我没有得到任何结果。搜索“?apple*”确实有效(如:返回带有“(apple) OR (banana)”的文档,所以我知道它存在)
  • @Gybelle 我在本地使用"query": "\\(apple\\) OR \\(banana\\)" 进行了尝试,它给了我预期的搜索结果
  • 用你的解决方案解决了我的问题,但是在 \(apple\) OR \(banana\) 周围加上了额外的双引号。谢谢!
  • @Gybelle 很高兴这对你有用?谢谢你接受我的回答,你能不能也给我的答案投票?+1为你的问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多