2014-04-23 20 views
42

Chcę wykonać zarówno dopasowanie ścisłe, jak i częściowe dopasowanie słowa/podłańcucha. Na przykład, jeśli szukam "golarki męskiej", powinienem znaleźć w tej sytuacji "golarkę męska". Ale na wszelki wypadek szukam "golarki en" i wtedy powinienem znaleźć "golarkę męska" w wyniku. I stosując następujące ustawienia i mapowania:Elasticsearch: Znajdź podłańcuch dopasowania

Ustawienia indeksu:

PUT /my_index 
{ 
    "settings": { 
     "number_of_shards": 1, 
     "analysis": { 
      "filter": { 
       "autocomplete_filter": { 
        "type":  "edge_ngram", 
        "min_gram": 1, 
        "max_gram": 20 
       } 
      }, 
      "analyzer": { 
       "autocomplete": { 
        "type":  "custom", 
        "tokenizer": "standard", 
        "filter": [ 
         "lowercase", 
         "autocomplete_filter" 
        ] 
       } 
      } 
     } 
    } 
} 

mapowania:

PUT /my_index/my_type/_mapping 
{ 
    "my_type": { 
     "properties": { 
      "name": { 
       "type":   "string", 
       "index_analyzer": "autocomplete", 
       "search_analyzer": "standard" 
      } 
     } 
    } 
} 

Rejestry Wkładka:

POST /my_index/my_type/_bulk 
{ "index": { "_id": 1   }} 
{ "name": "men's shaver" } 
{ "index": { "_id": 2   }} 
{ "name": "women's shaver" } 

Zapytanie:

1. Aby wyszukać według dokładnego dopasowania do wyrażenia -> "męska"

POST /my_index/my_type/_search 
{ 
    "query": { 
     "match": { 
      "name": "men's" 
     } 
    } 
} 

Powyższe zapytanie zwróci "golarki męskie" w wyniku zwrotnego.

2. Aby wyszukać według częściowe słowo meczu -> "pl w"

POST /my_index/my_type/_search 
{ 
    "query": { 
     "match": { 
      "name": "en's" 
     } 
    } 
} 

Powyższe zapytanie niczego nie powrócić.

Próbowałem również następujące zapytania

POST /my_index/my_type/_search 
{ 
    "query": { 
     "wildcard": { 
      "name": { 
       "value": "%en's%" 
      } 
     } 
    } 
} 

wciąż nie wszystko. Uznałem, że jest to spowodowane filtrem typu "edge_ngram" w indeksie, który nie może znaleźć "częściowego dopasowania słowa/sbustringu". Próbowałem również filtr typu "n-gram", ale spowalnia wyszukiwanie.

Proszę zasugerować, jak osiągnąć dopasowanie zarówno do wyrażenia, jak i do częściowego dopasowania fraz przy użyciu tego samego ustawienia indeksu.

Odpowiedz

53

Aby wyszukać częściowe dopasowania pól i dokładne dopasowania, będzie działał lepiej, jeśli zdefiniujesz pola jako "nie analizowane" lub jako słowa kluczowe (zamiast tekstu), a następnie użyj zapytania wieloznacznego.

See also this.

Aby użyć kwerendy wieloznaczny, dołącz * na obu końcach łańcucha szukasz:

POST /my_index/my_type/_search 
{ 
"query": { 
    "wildcard": { 
     "name": { 
      "value": "*en's*" 
     } 
    } 
} 
} 

Aby korzystać z przypadku niewrażliwości, użyć niestandardowego analizatora z małymi filtrem i tokenizera słów kluczowych.

klienta Analyzer:

"custom_analyzer": { 
      "tokenizer": "keyword", 
      "filter": ["lowercase"] 
     } 

Bądź wyszukiwany ciąg małą

Jeśli masz szukać ciąg jako ASD: zmienić na * USA *

+0

Dzięki. Mogę szukać teraz. –

+1

@BlackPOP - Wielkie dzięki ... Uratowałeś mnie ... – hemu

+4

Wystarczy zacytować dokumentację ElasticSearch: "Ostrzeżenie: zezwolenie na użycie wieloznacznika na początku słowa (np." * Ing ") jest szczególnie ciężkie, ponieważ wszystkie terminy w indeks musi być zbadany " http://www.elastic.co/guide/en/elasticsearch/reference/1.x/query-dsl-query-string-query.html#_wildcards –

-2

By wyszukiwanie za pomocą dowolnego ciągu znaków lub podłańcuchowego Use:

query: { 
    or: [{ 
     match_phrase_prefix: { 
      name: str 
    } 
    }, { 
     match_phrase_prefix: { 
      surname: str 
     } 
    }] 
} 

Szczęśliwy kodowanie z Elastic Search ....

+1

Nie szuka jednak pasującego prefiksu. – kjprice

Powiązane problemy