2015-04-20 2 views
11

Я пытаюсь реализовать навигацию по A-Z для своего контента с помощью Elasticsearch. Что мне нужно, отображает все результаты, которые начинаются с, например. а, б, в, ... и т.д.Elasticsearch "начинается с" первого слова во фразах

Я пробовал:

"query": { 
     "match_phrase_prefix" : { 
     "title" : { 
      "query" : "a" 
     } 
     } 
    } 

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

"Название": "Apfelpfannkuchen",

"Название": "аффогато",

"название"

: "Kalbsschnitzel п A Ceto Balsamico",

Я хочу показать только фразу, где начинается ПЕРВЫЙ текст с.

Здесь отображение я использую:

$params = array(
      'index' => 'my_index', 
      'body' => array(
       'settings' => array(
        'number_of_shards' => 1, 
        'index' => array(
         'analysis' => array(
          'filter' => array(
           'nGram_filter' => array(
            'type' => 'nGram', 
            'min_gram' => 2, 
            'max_gram' => 20, 
            'token_chars' => array('letter', 'digit', 'punctuation', 'symbol') 
           ) 
          ), 
          'analyzer' => array(
           'nGram_analyzer' => array(
            'type' => 'custom', 
            'tokenizer' => 'whitespace', 
            'filter' => array('lowercase', 'asciifolding', 'nGram_filter') 
           ), 
           'whitespace_analyzer' => array(
            'type' => 'custom', 
            'tokenizer' => 'whitespace', 
            'filter' => array('lowercase', 'asciifolding') 
           ), 
           'analyzer_startswith' => array(
            'tokenizer' => 'keyword', 
            'filter' => 'lowercase' 
           ) 
          ) 
         ) 
        ) 
       ), 
       'mappings' => array(
        'tags' => array(
         '_all' => array(
          'type' => 'string', 
          'index_analyzer' => 'nGram_analyzer', 
          'search_analyzer' => 'whitespace_analyzer' 
         ), 
         'properties' => array() 

        ), 
        'posts' => array(
         '_all' => array(
          'index_analyzer' => 'nGram_analyzer', 
          'search_analyzer' => 'whitespace_analyzer' 
         ), 
         'properties' => array(
          'title' => array(
           'type' => 'string', 
           'index_analyzer' => 'analyzer_startswith', 
           'search_analyzer' => 'analyzer_startswith' 
          ) 
         ) 
        ) 
       ) 
      ) 
     ); 
+0

Вы можете разделить отображение. – Roopendra

+0

Это похоже на elasticsearch2, вы можете пометить его как таковой? –

ответ

10

Если вы используете отображение по умолчанию, то он не будет работать для вас.

Вы должны использовать keyword tokenizer и lowercase filter в картографии.

Mapping Будет:

{ 
    "settings": { 
     "index": { 
      "analysis": { 
       "analyzer": { 
        "analyzer_startswith": { 
         "tokenizer": "keyword", 
         "filter": "lowercase" 
        } 
       } 
      } 
     } 
    }, 
    "mappings": { 
     "test_index": { 
      "properties": { 
       "title": { 
        "search_analyzer": "analyzer_startswith", 
        "index_analyzer": "analyzer_startswith", 
        "type": "string" 
       } 
      } 
     } 
    } 
} 

Поисковый запрос на test_index:

{ 
    "query": { 
     "match_phrase_prefix": { 
      "title": { 
       "query": "a" 
      } 
     } 
    } 
} 

Это будет возвращать все ДОЛЖНОСТЬ начиная с a

+0

Работает идеально. Большое спасибо! – alin

+0

Ваш прием :-) – Roopendra

+0

У меня возникла проблема: запрос не отображает более 59 результатов. – alin

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