2014-02-13 4 views
0

Моя цель - найти значение по нескольким полям и вернуть количество этих значений и отдельное значение.Elasticsearch поиск значения по нескольким полям

Для этого я понял, что должен использовать грани.

Это схема базы данных:

index: 
    analysis: 
     analyzer: 
      custom_search_analyzer: 
       type: custom 
       tokenizer: standard 
       filter : [standard, snowball, lowercase, asciifolding] 
      custom_index_analyzer: 
       type: custom 
       tokenizer: standard 
       filter : [standard, snowball, lowercase, asciifolding, custom_filter] 
     filter: 
      custom_filter: 
       type: edgeNGram 
       side: front 
       min_gram: 1 
       max_gram: 20 

{ 
"structure": { 
    "properties": { 
    "name": {"type": "string", "search_analyzer": "custom_search_analyzer", "index_analyzer": "custom_index_analyzer"}, 
    "locality": {"type": "string", "search_analyzer": "custom_search_analyzer", "index_analyzer": "custom_index_analyzer"}, 
    "province": {"type": "string", "search_analyzer": "custom_search_analyzer", "index_analyzer": "custom_index_analyzer"}, 
    "region": {"type": "string", "search_analyzer": "custom_search_analyzer", "index_analyzer": "custom_index_analyzer"} 
    } 
} 
} 

и это вопрос, который я пытался использовать:

{ 
"query": { 
    "bool": { 
     "should": [ 
     { 
      "match": { 
      "locality": "bolo" 
      } 
     }, 
     { 
      "match": { 
      "region": "bolo" 
      } 
     }, 
     { 
      "match": { 
      "name": "bolo" 
      } 
     } 
     ] 
    } 
    }, 
    "facets": { 
    "region": { 
     "query": { 
     "term": { 
      "region": "bolo" 
     } 
     } 
    }, 
    "locality": { 
     "query": { 
     "term": { 
      "locality": "bolo" 
     } 
     } 
    }, 
    "name": { 
     "query": { 
     "term": { 
      "name": "bolo" 
     } 
     } 
    } 
    } 
} 

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

Например, приведенный выше запрос возвращает следующий результат:

facets: { 
     region: { 
     _type: query 
     count: 0 
    } 
    locality: { 
     _type: query 
     count: 2 
    } 
    name: { 
     _type: query 
     count: 0 
    } 
} 

Я хотел бы иметь результат, как это (не так явно написано правильно, но понимаю, что мне нужно):

facets: { 
    .... 
    locality: { 
     _type: query 
     "terms": [ 
      {"term": "Bologna", "count": 1}, 
      {"term": "Bolognano", "count": 1} 
     ] 

    } 

Как я могу это сделать?

Я уже пытался использовать «термины» вместо «запроса» в гране и поставить «index: not_analyzed» в области исследований, но возвращается только в том случае, если я попробую точную область действия, а не ее часть!

+0

, если я вас правильно понял, вы хотите создать фасет фильтры, чтобы соответствовать только одно поле и один аспект, который охватывает все поля для общего количества. – phoet

+0

Не совсем, мне жаль, что для всех граней мне не нужно возвращать общий счет, а содержимое поля, которое соответствует поиску, и количество найденного содержимого. В качестве примера я написал выше. Такая вещь получается с использованием грани 'terms' вместо' query', только 'terms' находит только точное совпадение поля! – Lughino

ответ

0

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

Я считаю, что вы ищете агрегацию счета значение - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-valuecount-aggregation.html

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