2016-03-20 5 views
0

Привета Я хотел бы индексировать объекты, которые выглядят как тоElasticSearch сравнительного диапазон результаты

{ 
    uuid: "123", 
    clauses: [{ order: 1, uuid: "345"},{ order: 2, uuid: "567"},{ order: 3, uuid: "789"}] 

} 

Есть ли способ, чтобы написать запрос, который соответствует всем объектам, которые содержат пунктов с UUID: «345» и UUID : «789», а порядок второго - не более двух больше первого?

Так в приведенном выше примере будет соответствовать, но следующий не будет:

{ 
    uuid: "999", 
    clauses: [{ order: 1, uuid: "345"},{ order: 2, uuid: "567"},{order: 3, uuid: "777"},{ order: 4, uuid: "789"}] 

} 

Причина заключается в том, что порядок «789» оговорка 4, который больше, чем 2 больше, чем «345» пункт, который имеет заказ 1.

Любая помощь приветствуется! Спасибо, Michail

ответ

1

Один из способов достижения этого состоит в использовании script filter.

Сценарий я использую следующее:

def idxs = []; 
for (int i = 0; i < doc['clauses.uuid'].values.size(); i++) { 
    if (matches.contains(doc['clauses.uuid'].values[i])){ 
     idxs << i 
    } 
}; 
def orders = idxs.collect{ doc['clauses.order'].values[it]}; 
return orders[1] - orders[0] <= 2 

В общем, что я делаю это первый сборник все индексы статей, которые содержат uuid в matches массиве (т.е. 345 и 789) , Затем, с полученными индексами, я собираю все значения order по этим показателям. И, наконец, проверить, что второй order минус первый order не больше 2.

POST your_index/_search 
{ 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "term": { 
      "clauses.uuid": "345" 
      } 
     }, 
     { 
      "term": { 
      "clauses.uuid": "789" 
      } 
     }, 
     { 
      "script": { 
      "script": "def idxs = []; for (int i = 0; i < doc['clauses.uuid'].values.size(); i++) {if (matches.contains(doc['clauses.uuid'].values[i])){idxs << i}}; def orders = idxs.collect{doc['clauses.order'].values[it]}; return orders[1] - orders[0] <= 2", 
      "params": { 
       "matches": [ 
       "345", 
       "789" 
       ] 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

Это будет возвращать только первый документ, а не второй.

+0

Спасибо, я попробую! Считаете ли вы, что это может быть очень интенсивным? - Я имел в виду фактическое предварительное вычисление forwardClaus для каждого предложения, а затем использовать вложенную фильтрацию. Интересно, какой подход будет быстрее во время поиска. –

+1

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