2015-04-20 10 views
11

İçeriğim için Elasticsearch ile bir A - Z navigasyonu uygulamaya çalışıyorum. İhtiyacım olan şey, örn. a, b, c, ... vbElasticsearch, "first with words" ifadelerinde ilk kelime ile başlar

denedim:

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

dize içinde bir kelime ile başlar nerede ayrıca, sonuçlarını görüntülemek yukarıda bahsedilen sorgu. Örnek:

"başlığı": "Apfelpfannkuchen",

"başlığı": "Affogato",

"başlığı": "Kalbsschnitzel bir n bir seto balsamik",

Sadece İLK kelimesinin a ile başladığını ifade etmek istiyorum.

İşte haritalama kullandığım: Varsayılan eşleme kullanıyorsanız o zaman sizin için çalışmaz

$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

ile başlayan tüm yayın başlığı dönecektir. – Roopendra

+0

Bu elasticsearch2 gibi görünüyor, bunu etiketleyebilir misiniz? –

cevap

10

.

Eşleştirmede keyword tokenizer ve lowercase filter numaralı sayfaları kullanmanız gerekir.

Haritalama olacak: test_index üzerine

{ 
    "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" 
       } 
      } 
     } 
    } 
} 

Arama sorgusu:

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

Bu eşleme paylaşabilir miyim a

+0

Mükemmel çalışır. Çok teşekkür ederim! – alin

+0

Hoşgeldin :-) – Roopendra

+0

Bir sorunla karşılaştım: Sorgu 59'dan fazla sonuç göstermiyor. – alin