2013-10-01 2 views
0

У меня есть индекс документов, которые выглядят следующим образом:Повышая совпавшие документы в Elasticsearch, которые имеют определенный тег

{ 
    url: "/foo/bar", 
    html_blocks: [ 
     "<h1>hi</h1>" 
    ], 
    tags: [ 
     "video", 
     "text" 
    ], 
    title: "My title" 
} 

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

До сих пор мой запрос выглядит следующим образом:

{ 
    "query": { 
     "query_string": { 
      "query": "foo", 
      "fields": [ 
       "title", 
       "html_blocks" 
      ] 
     } 
    } 
} 

Как изменить его так, что он продолжает возвращать только результаты, если найдено совпадение в существующем запросе, но импульс добавляется к любому из результатов, которые имеют видео тег? Благодаря!

ответ

3

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

См: Custom_filters_score

{ 
    "query": { 
     "custom_filters_score": { 
      "query": { 
       "query_string": { 
        "query": "foo", 
        "fields": [ 
         "title", 
         "html_blocks" 
        ] 
       } 
      }, 
      "filters": [ 
       { 
        "filter": { 
         "term": { 
          "tags": "video" 
         } 
        }, 
        "boost": 3 
       } 
      ] 
     } 
    } 
} 

Edit:

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

{ 
    "query": { 
     "custom_filters_score": { 
      "query": { 
       "query_string": { 
        "query": "foo", 
        "fields": [ 
         "title", 
         "html_blocks" 
        ] 
       } 
      }, 
      "filters": [ 
       { 
        "filter": { 
         //here comes the filter query, and I changed term to match 
         //since match analyzes 
         "query":{       
          "match": { 
           "tags": "video" 
          } 
         } 
        }, 
        "boost": 3 
       } 
      ] 
     } 
    } 
} 
+0

Это работает. Спасибо за отличный ответ! –

+0

Кроме того, если вы не возражаете объяснить, как обернуть фильтр в запрос, я не совсем понимаю это. Вы ссылались на «fquery»? http://www.elasticsearch.org/guide/reference/query-dsl/query-filter/ –

+0

Нет проблем. Редактировать выше и, да, это бит, на который я ссылался. –

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