Elasticsearch должен одни значения и не должен все другие - PullRequest
0 голосов
/ 24 ноября 2018

поэтому у меня есть индекс со следующим отображением:

{
"tests": {
    "mappings": {
        "test": {
            "properties": {
                "arr": {
                    "properties": {
                        "name": {
                            "type": "long"
                        }
                    }
                }
            }
        }
    }
}

У меня есть 3 документа со следующими значениями для поля "arr":

  1. arr: [{name: 1}, {name: 2}, {name: 3}]
  2. arr: [{name: 1}, {name: 2}, {name: 4}]
  3. arr: [{name: 1}, {name: 2}]

Я хотел бы найти способ найти документы, в которых все значения имен находятся в массивеназвание.Однако документ не должен иметь все значения массива, и если он имеет одно значение, которого нет в массиве, то документ не годится.

Например:

  1. Если мой массив имен [1,2], то мне нужен только документ 3, но у меня есть все они
  2. Если мой массив имен [1,2,3], тогда я хочу документ 1 и3, но у меня есть только документ 1 с must и все они с should
  3. Если мой массив имен [1,2,4], то я хочу документы 2 и 3, но у меня есть только документ 2с must и все они с should
  4. Если мой массив имен [1], то я не хочу никаких документов, но у меня все они

Здесь, массивы маленькие, в моем проекте массивы в документах намного больше, а также массив сравнений.

Итак, чтобы быть конкретным, мне нужно искать таким образом:

  1. Все имена в документе находятся в массиве имен
  2. Документ не должен иметь ВСЕ значениеes в массиве имени

Заранее спасибо

1 Ответ

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

Использование сценариев (без изменения сопоставления)

Никаких изменений сопоставления для того, что у вас уже есть, не требуется.

Я придумал следующий скрипт.Я полагаю, что основная логика в сценарии, который я думаю, самоочевиден.

POST test_index_arr/_search
{
  "query":{
    "bool": {
      "filter": { 
        "script": {
          "script": {
            "source" : """
              List myList = doc['arr.name'];
              int tempVal = myList.size();
              for(int i=0; i<params.ids.size(); i++){
                long temp = params.ids.get(i);
                if(myList.contains(temp))
                {
                  tempVal = tempVal - 1;
                }

                if(tempVal==0){
                  break;
                }
              }

              if(tempVal==0)
                return true;
              else
                return false;
            """,
            "lang"   : "painless",
            "params": {
              "ids": [1,2,4]
            }
          }
        }
      }
    }
  }
}

Итак, что делает сценарий, он проверяет, есть ли у документа все его номера в его arr, присутствующем во входных данных, и если это так, он возвращает документ.

В приведенном выше запросе часть "ids": [1,2,4] действует как ввод.Вам необходимо добавить / удалить / обновить значения здесь, в зависимости от ваших требований.

Надеюсь, это поможет!

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