2013-03-11 3 views
0

У меня есть поле массива containig списка строк: например .: [ «Нью-Йорк», «CA»]Elasticsearch сортировки на основе количества вхождений строки появляется в массиве

На время поиска у меня есть фильтр, который соответствует любой из строк в массиве.

Я хотел бы сортировать результаты, основанные на документах, которые имеют наибольшее количество появлений искали строки: «Нью-Йорк»

Результаты должны включать: документ 1: [ «CA», «Нью-Йорк», "Нью-Йорк"] документ 2: [ "Нью-Йорк", Флорида "] документ 3: [" Нью-Йорк "Калифорния", "Нью-Йорк", "Нью-Йорк"]

Результаты должны быть заказаны как таковой

Пользователь 3, Пользователь 1, Пользователь 2

Это возможно? Если да, то как?

+0

я эту проблему прямо сейчас, и я думаю, что на практике это будет сортировать на основе долгосрочных частот IF другие документы имеют «CA», но не Нью-Йорк. –

ответ

0

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

curl -X POST "http://localhost:9200/index/document/1" -d '{"id":1,"states_ties":["CA"],"state_abbreviation":"CA","worked_in_states":["CA"],"training_in_states":["CA"]}' 
curl -X POST "http://localhost:9200/index/document/2" -d '{"id":2,"states_ties":["CA","NY"],"state_abbreviation":"FL","worked_in_states":["NY","CA"],"training_in_states":["NY","CA"]}' 
curl -X POST "http://localhost:9200/index/document/3" -d '{"id":3,"states_ties":["CA","NY","FL"],"state_abbreviation":"NY","worked_in_states":["NY","CA"],"training_in_states":["NY","FL"]}' 

curl -X GET 'http://localhost:9200/index/_search?per_page=10&pretty' -d '{ 
    "query": { 
    "custom_filters_score": { 
     "query": { 
     "terms": { 
      "states_ties": [ 
      "CA" 
      ] 
     } 
     }, 
     "filters": [ 
     { 
      "filter": { 
      "term": { 
       "state_abbreviation": "CA" 
      } 
      }, 
      "boost": 1.03 
     }, 
     { 
      "filter": { 
      "terms": { 
       "worked_in_states": [ 
       "CA" 
       ] 
      } 
      }, 
      "boost": 1.02 
     }, 
     { 
      "filter": { 
      "terms": { 
       "training_in_states": [ 
       "CA" 
       ] 
      } 
      }, 
      "boost": 1.01 
     } 
     ], 
     "score_mode": "multiply" 
    } 
    }, 
    "sort": [ 
    { 
     "_score": "desc" 
    } 
    ] 
}' 

results: id: score 

1: 0.75584483 
2: 0.73383 
3: 0.7265643 
0

Это будет достигнуто путем стандартного выполнения оценки Lucene. Если вы просто искали «Нью-Йорк», не указав приказ, он будет сортироваться по релевантности и будет присваивать наивысшую актуальность документу с большим количеством событий этого термина, при прочих равных условиях.

+0

Не для запроса фильтра, я добавил код поддержки к вопросу. – brupm

+1

А, я вижу. Я не верю, что вы можете это сделать. Фильтрация делает то, что она говорит, она фильтрует. Либо док проходит через фильтр, либо нет. Он просто ограничивает набор результатов. Я не верю, что существует какая-либо концепция, позволяющая вам определить, что doc1 передает фильтр лучше, чем doc2. Я бы предположил, что использование фильтра - неправильный способ приблизиться к вашей проблеме. – femtoRgon

+0

https://gist.github.com/brupm/5138787 вот код поддержки. Но я верю, что femtoRgon верен. – brupm

Смежные вопросы