【问题标题】:Elastic search - return documents which have strings other than a specific string弹性搜索 - 返回具有特定字符串以外的字符串的文档
【发布时间】:2021-08-19 07:58:46
【问题描述】:

我想返回那些在 infoList 中具有任何其他值的文档,而不是从“cake”开始的文档。例如:这是完整的数据:

  {   "brand" : "A",
      "productType" : "food",
      "infoList" : [
        "pizza-34","cake-qaw-34"
      ]},
   {
      "brand" : "B",
      "productType" : "food",
      "infoList" : [
        "pasta-3"
      ]},
   {
      "brand" : "c",
      "productType" : "food",
      "infoList" : [
        "cake-233"
      ]}

运行弹性搜索查询后,我应该只获取这些数据,因为它们具有其他不以“cake”开头的值(pizza-34、pasta-3)。如果有任何文件只有蛋糕,则不应退回。

{   "brand" : "A",
      "productType" : "food",
      "infoList" : [
        "pizza-34","cake-qaw-34"
      ]},
   {
      "brand" : "B",
      "productType" : "food",
      "infoList" : [
        "pasta-3"
      ]},

【问题讨论】:

    标签: elasticsearch elastic-stack elasticsearch-5


    【解决方案1】:

    在 Elasticsearch 中,没有专用的数组数据类型。默认情况下,任何字段都可以包含零个或多个值,但是,数组中的所有值必须是相同的数据类型更多信息here。因此,无法区分 Array 数据类型中的元素。所以如果你运行这个查询:

    查询:

    GET myindex2/_search
    {
      "query": {
        "bool": {
          "must_not": [
            {
              "prefix": {
                "infoList": "cake"
              }
            }
          ]
        }
      }
    }
    

    结果将如下所示:

    结果:

    "_source" : {
              "brand" : "B",
              "productType" : "food",
              "infoList" : [
                "pasta-3"
              ]
    }
    

    如您所见,您只会得到没有 cake 的文档,并且带有“pizza-34”、“cake-qaw-34”的文档不会返回,因为 Elastic 将整个数组视为单个字符串。如果你想得到你想要的结果,你需要从 Elasticsearch 中查询,然后过滤结果。

    【讨论】:

    • 你能展示如何得到这个结果吗?此外,我的数组 infoList 中的所有数据都是字符串数据类型
    • 没有一种简单的方法可以在 Elasticsearch 中执行您想要的查询,您需要更改映射以更好地支持您的需求或从 ES 检索数据并在后端过滤您喜欢的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    相关资源
    最近更新 更多