Проверьте наличие идентификатора в массиве параметров с помощью пользовательского поля скрипта Elasticsearch.

Можно ли добавить настраиваемое поле сценария, которое является логическим и возвращает true, если идентификатор документа существует в массиве, который отправляется в качестве параметра?

Что-то вроде этого https://gist.github.com/2437370

Как правильно это сделать с помощью mvel?

Обновление: возникли проблемы с его работой, как указано в ответе Имотова.

Отображение:

Сортировать:

:sort=>{:_script=>{:script=>"return friends_visits_ids.contains(_fields._id.value)", :type=>"string", :params=>{:friends_visits_ids=>["4f8d425366eaa71471000011"]}, :order=>"asc"}}}

place: { properties: { _id: { index: "not_analyzed", store: "yes" }, } }

Я не получаю никаких ошибок, документы просто не сортируются правильно.

Обновление 2

О, и я возвращаюсь к документам:

"sort"=>["false"]


person Yeggeps    schedule 22.04.2012    source источник


Ответы (1)


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

"sort" : {
  "_script" : {
    "script" : "return friends_visits_ids.containsKey(_fields._id.value)",
    "type" : "string",
    "params": {
      "friends_visits_ids": { "1" : {}, "2" : {}, "4" : {}}
    }
  }
}

Убедитесь, что поле id сохранено. В противном случае _fields._id.value вернет null для всех записей.

person imotov    schedule 22.04.2012
comment
Эй, спасибо за ваш ответ, но получаю эту ошибку: Query Failed [Failed to execute main query]]; nested: PropertyAccessException[[Error: unable to resolve method: java.util.ArrayList.containsKey() РЕДАКТИРОВАТЬ: NVM, у меня все еще был массив. - person Yeggeps; 22.04.2012
comment
Вы можете использовать массив, если он достаточно мал. Вам просто нужно заменить containsKey() на contains(). - person imotov; 22.04.2012
comment
Что будет достаточно маленьким? ‹ 50? - person Yeggeps; 22.04.2012
comment
Это зависит от данных в вашем списке результатов. Это в основном накладные расходы на создание HashMap по сравнению с накладными расходами на сканирование ArrayList и то, как все это сравнивается с извлечением записи из индекса. Хеш-карта строится один раз, массив сканируется для каждой записи в списке результатов. С 50 записями HashMap будет в 10-20 раз быстрее. Но тогда для 1 млн записей мы говорим о разнице в 100 мс и 10 мс. Так что, если бы это было ‹5, я думаю, вы бы вообще не увидели большой разницы. С ‹50 я бы, наверное, попробовал, на всякий случай. - person imotov; 22.04.2012