2014-08-31 2 views
2

Так что мое приложение Rails, использующее elasticsearch (с searchkick), отлично работает с помощью функции заказа _geo_distance, однако мне нужно сделать более сложное упорядочение, включающее в себя местоположение, и попытку продвинуть совпадение точной строки имени компании.Rails elasticsearch _geo_distance и пользовательский подсчет/сортировка

Например, если я делаю запрос и есть 10 результатов с восходящим удалением, но результат # 5 также является точным совпадением строк в названии предприятия в записи, я хотел бы повысить/повысить его до # 1 (в основном, переопределение расстояния для этой записи).

Есть два способа, которые я могу увидеть, чтобы попытаться решить эту проблему, но у меня проблемы с обоими.

Во-первых, это должно было сделать это при первоначальном запросе, чтобы elasticsearch обрабатывал работу.

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

Проблема с первым методом заключается в том, что встроенные механизмы подсчета, похоже, полностью сдвигаются на расстояние при вызове _geo_distance, оставляя меня задуматься о том, как смешивать собственные функции подсчета очков с местоположением.

И проблема со вторым методом заключается в том, что возвращенные результаты поиска представляют собой нестандартный тип объекта SearchKick, который, похоже, не похож на обычные механизмы сортировки или хэш-сортировки для постпроцесса.

Есть ли способ сделать что-то до или после запроса, чтобы продвигать документ в результатах таким образом?

Спасибо.

ответ

1

На самом деле существует множество способов «контролировать» подсчет очков. Перед индексированием, если вы уже какой-то документ должен получить высокий балл/повышение. Вы можете дать высокий балл для специального документа перед индексированием, пожалуйста, обратитесь к here.

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

Для запроса строки запроса:

Вы можете усилить некоторые поля, такие как fields" : ["content", "name.*^5"] или увеличить какую-либо команду запроса, например, quick^2 fox (это может работать для вас, просто дополнительный импульс имя).

Для других:

Вы можете дать толчок для термина запроса, например, повышая «иван» случай:

"term" : {"name" : {"value" : "ivan","boost" : 10.0}}

вы можете обернуть его в BOOL запрос и повысить желаемый дело. ех. найти все «ivan», повысить «ji» в поле имени.

{ "запрос": { "BOOL": { "должен": [{ "совпадение": { "имя": "иван"}}],
"следует": [{ "термин" : { "имя": { "значение": "джи", "подталкивание": 10}}}]}}}

для термина запроса за исключением, есть много запросов, которые поддерживают повышение, например, prefix запрос, match запрос. Вы можете использовать его в ситуациях. Вот некоторые официальные примеры: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_boosting_query_clauses.html

Ускорение может быть нелегким для управления счетом, потому что оно нуждается в нормализации. Вы можете указать счет, используя запрос function_score, чтобы указать прямой счет: это действительно полезный запрос, если вам нужно больше прямого контроля.


Короче говоря, вы можете обернуть запрос в BOOL и добавить импульс для сопоставления имен, следующим образом:

{ "query" : { 
    "bool" : { 
    "must": [ 
      {"filtered" : { 
      "filter" : { 
       "geo_distance" : { 
        "distance" : "2000km", 
        "loc" : { 
         "lat" : 10, 
         "lon" : 10 
        } 
       } 
      } 
     }}], 
    "should" : [ { "term" : { "name": { "value" : "ivan", "boost" : 10 }}}]}}, 
"sort" : [ 
      "_score", 
    { 
     "_geo_distance" : { 
      "loc" : [10, 10], 
      "order" : "asc", 
      "unit" : "km", 
      "mode" : "min", 
      "distance_type" : "sloppy_arc" 
     } 
    } 
] 
} 

Для более подробной, вы можете проверить мою суть https://gist.github.com/hxuanji/e5acd9a5174ea10c08b8. Я увеличиваю имя «ivan». В результате документ «ivan» становится первым, а не документом (10,10).

+1

Спасибо за ваш ответ, однако я до сих пор не знаю, как этот счет будет работать с оценкой/результатами геоданных. Результаты геометрии сортируются по расстоянию, что, по-видимому, изменяет обычные функции подсчета очков. В таком случае усиление «оценки» приведет к неправильному измерению расстояния. Как же сохранить геологические измерения и по-прежнему продвигать документ? – kayatela

+0

Я предполагаю, что другой способ приблизиться к этому будет состоять в том, чтобы результаты были отсортированы по _score (не geo), но также включают данные _geo_distance в возвращаемых результатах. Но я тоже не понял, как это сделать. – kayatela

+0

проверить мое редактирование выше, я привел вам пример. – hxuanji