在数组中查找多个精确值

时间:2018-07-04 12:27:12

标签: arrays elasticsearch elasticsearch-5 exact-match

我有一个如下所示的文档,其中PCL为关键字

  {
    "name": "test",
    "PCL": [
            "product1_company1_location1",
            "product2_company2_location2"
          ]
  }

我正在尝试查找与数组中给定值完全匹配的所有文档的计数。但是,弹性搜索文档清楚地指出,由于“项”和“项”是“包含运算”,因此没有“完全相等”,并且由于用户可以在数组中拥有尽可能多的元素,因此建议的使用count的解决方案在这里不起作用。

我试图使PCL字段成为由字符分隔的字符串,以区分每个PCL,但是如果字符串的顺序不同,例如P1C1L1_P2C2L2与P2C2L2_P1C1L1,则使用相同PCL的用户不太可能请参阅其他文档。

这是我要解决的查询

   GET indexName/_search
   {
    "query": {
     "bool": {
      "should": [
       {
          "bool": {
            "must": [
              {
                "terms": {
                  "PCL": [
                    "product1_company1_vendor1",
                    "product2_company2_vendor2"
                  ]
                }
              }
            ]
          }
         },
         {
           "bool": {
             "must": [
               {
                 "terms": {
                   "PCL": [
                     "product1_company1_vendor_1",
                     "product3_company3_vendor_3"
                   ]
                 }
               }
             ]
           }
          }
        ]
      }
     },
     "aggs": {
      "PCL": {
        "terms": {
          "field": "PCL"
         }
       }
     }
   }

是否有使用Elasticsearch来实现这一目标?  (注意:我已经决定对PCL进行排序,因此不会出现顺序冲突,并将其存储为字符串,因为不可能在数组中进行完全匹配)

1 个答案:

答案 0 :(得分:0)

如果要获得完全匹配,则必须将搜索字符串括在"中。这将确保检索完全匹配的结果。

例如:

{
  "name": "test",
  "PCL": [
           "\"product1_company1_location1\"",
           "\"product2_company2_location2\""
         ]
}