2015-03-11 3 views
0

Я использую ES для своего приложения Laravel, и мне нужно сделать поисковый запрос, который содержит только фильтры и никакого «текстового поиска», но я не уверен, как Напиши это.Можно ли использовать фильтры без текстового поиска в elasticsearch

Должен ли я использовать match_all например:

$query = [ 
    'filtered' => [ 
    'query' => [ 
     'match_all' => [] 
    ], 
     'filter'=> [ 
     'bool' => [ 
      'must' => [ 
       [ 'range' => [ 
        'price' => [ 
        'lte' => 9000 
        ] 
       ] 
       ], 
      ], 
     ] 
     ], 
    ], 
]; 

Или как это:

$query = [ 
    'filtered' => [ 
     'filter'=> [ 
     'bool' => [ 
      'must' => [ 
       [ 'range' => [ 
        'price' => [ 
        'lte' => 9000 
        ] 
       ] 
       ], 
      ], 
     ] 
     ], 
    ], 
]; 

То, что я хочу, чтобы использовать только фильтрованную булев запрос без текстового поиска.

ответ

1

Фактически, если вы не укажете в своем отфильтрованном запросе query, по умолчанию используется запрос match_all. Цитирование doc:

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

Ваш второй запрос должен делать эту работу: фильтры должны быть обернуты либо в filtered (doc) или constant_score (doc) запросов, которые будут использоваться.

Если оценка не подходит для вас, вы можете придерживаться запроса filtered.

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

$query = [ 
    'filtered' => [ 
     'filter'=> [ 
     'range' => [ 
      'price' => [ 
       'lte' => 9000 
      ] 
      ] 
     ] 
    ] 
]; 

Надеется, что это будет полезно :)

+0

Спасибо! Затем я отправлюсь с моим вторым запросом. У меня есть несколько фильтров внутри bool. Я просто удалил некоторых и забыл удалить bool, а также для этого примера :) – user2722667

1

Это на самом деле одно и то же, так как, если запрос не указан в пункте него по умолчанию для использования match_all запрос.

Хотя в контексте запроса, если вам необходимо использовать фильтр без запроса (например, чтобы соответствовать всем сообщениям электронной почты в почтовом ящике), вы можете просто опустить запрос:

GET /_search 
{ 
    "query": { 
     "filtered": { 
      "filter": { "term": { "folder": "inbox" }} 
     } 
    } 
} 

Если запрос не указано, то по умолчанию для использования запроса match_all, поэтому предыдущий запрос эквивалентен следующему:

GET /_search 
{ 
    "query": { 
     "filtered": { 
      "query": { "match_all": {}}, 
      "filter": { "term": { "folder": "inbox" }} 
     } 
    } 
} 

Проверить здесь официальная документация: http://www.elastic.co/guide/en/elasticsearch/guide/current/_combining_queries_with_filters.html

+0

Приветствия для вас объяснения – user2722667