2012-05-25 4 views
7

Я пишу запрос, чтобы получить результаты, соответствующие одной из нескольких фраз, какОграничение количества результатов РЕКОМЕНДУЕМЫМ пунктов в упругом Поиск

{ 
    'size': 10, 
    'from': 0, 

    'query': { 
    'bool': { 
     'should': [ 
     {'text': {'title': { 'query': 'some words' }}}, 
     {'text': {'title': { 'query': 'other words' }}}, 
     {'text': {'title': { 'query': 'some other words' }}}, 
     ] 
    } 
    } 
} 

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

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

Проблема заключается в том, что я не вижу, как реализовать это с помощью запросов Elastic Search, и я не знаю, возможно ли это, или существует ли другой способ делать то, что я хочу.

Любые идеи?

Спасибо!

ответ

10

ElasticSearch ищет «наиболее релевантные» документы, соответствующие вашему запросу, в то время как вы пытаетесь достичь объединения 3 запросов.

Самый простой (и самый быстрый) способ сделать это было бы запустить три запроса, используя multi search:

curl -XGET 'http://127.0.0.1:9200/my_index/_msearch?pretty=1' -d ' 
{} 
{"query" : {"text" : {"title" : "some words"}}, "size" : 5} 
{} 
{"query" : {"text" : {"title" : "some other words"}}, "size" : 5} 
{} 
{"query" : {"text" : {"title" : "other words"}}, "size" : 5} 
' 

Альтернативой, в зависимости от ваших требований может быть использование limit filter, но учтите, что она ограничивает количество результатов PER SHARD, а не индекс. По умолчанию индекс имеет 5 первичных осколков, поэтому, если вы укажете предел 5, вы можете вернуть 25 результатов.

Так что, возможно, что-то вроде этого:

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1' -d ' 
{ 
    "query" : { 
     "bool" : { 
     "should" : [ 
      { 
       "filtered" : { 
        "filter" : { 
        "limit" : { 
         "value" : 1 
        } 
        }, 
        "query" : { 
        "text" : { 
         "title" : "some words" 
        } 
        } 
       } 
      }, 
      { 
       "filtered" : { 
        "filter" : { 
        "limit" : { 
         "value" : 1 
        } 
        }, 
        "query" : { 
        "text" : { 
         "title" : "other words" 
        } 
        } 
       } 
      }, 
      { 
       "filtered" : { 
        "filter" : { 
        "limit" : { 
         "value" : 1 
        } 
        }, 
        "query" : { 
        "text" : { 
         "title" : "some other words" 
        } 
        } 
       } 
      } 
     ] 
     } 
    } 
} 
' 

Это даст вам высокое скоринга документ для каждой фразы на каждом осколке (с 5 осколками, максимум 15 докторов, которые (потому что вы не указали size=15) будет сокращен до 10 лучших документов).

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

+0

Благодарим за советы по поиску! – Scharron