Elasticsearch - запросить точное значение в массиве, чтобы документы, содержащие это значение + другие, не возвращались - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь создать запрос для поиска значения, которое будет возвращать только те документы, которые имеют это точное значение (даже если оно повторяется в массиве), и никаких других документов (даже если есть 1 запись значения вмассив).Таким образом, "bar" : [ "A", "A"] будет иметь право, но не "bar" : [ "A", "B"]

Пример набора данных:

"loren" : [
  {
    "id" : "1", 
    "foo": [{"bar": "A"},{"bar": "A"}]
  },
  {
    "id" : "2", 
    "foo": [{"bar": "A"},{"bar": "B"}]
  },
]

Пример результата, который я ожидаю:

"hits": {
    "total": 1,
    "max_score": 0.3666863,
    "hits": [
        {
            "_index": "loren",
            "_type": "loren",
            "_id": "2",
            "_score": 0.3666863,
            "_source": {
                "foo": [
                    {
                        "bar": "A"
                    },
                    {
                        "bar": "A"
                    }
                ]
            }
        }
    ]
}

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

@ Камаль, спасибо за просветление.Это привело меня к ответу, который я думаю ... но дайте мне знать ваши мысли.

При фильтрации массивов выглядит так: doc['foo.bar'].size(); ,asticsearch делает count(distinct ...) sql-эквивалент и возвращает размер n для массивов с n различными значениями.

пример рабочего запроса:

GET /loren/_search 
{
   "_source":[
      "foo.bar"
   ],
   "query":{
      "bool":{
         "must":[
            {
               "match":{
                  "foo.bar":"A"
               }
            }
         ],
         "filter":{
            "script":{
               "script":{
                  "source":"1==doc['foo.bar'].size();",
                  "lang":"painless"
               }
            }
         }
      }
   }
}
0 голосов
/ 21 ноября 2018

Вы можете использовать ниже Script Query для того, что вы ищете.

Обратите внимание, что поле bar должно иметь тип keyword.

POST <your_search_index>/_search
{
  "query": {
        "bool" : {
            "filter" : {
                "script" : {
                    "script" : {
                        "source" : """
                          List myList = doc['bar'];
                          int size = myList.size();
                          int count = Collections.frequency(myList,params.token);
                          if(count==size)
                            return true;
                          """,
                        "lang"   : "painless",
                        "params": {
                          "token": "test"
                        }
                    }
                }
            }
        }
    }
}

В ответ вы получите список документов с полем bar, имеющим только test как его значение / значения.

Обратите внимание, что если ваше отображение создается динамически, вы можете попробовать с bar.keyword в приведенном выше запросе.

Дайте мне знать, если это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...