弹性搜索 - 返回包含特定字符串以外的字符串的文档

时间:2021-06-01 06:03:15

标签: elasticsearch elastic-stack elasticsearch-5

我想返回那些在 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"
      ]},

1 个答案:

答案 0 :(得分:0)

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

查询:

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

结果如下:

结果:

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

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