2013-08-23 27 views
13

Jestem całkiem nowy na elasticsearch i chcę używać synonimów, dodałem te linie w pliku konfiguracyjnym:jak skonfigurować synonyms_path w elasticsearch

index : 
    analysis : 
     analyzer : 
      synonym : 
       type : custom 
       tokenizer : whitespace 
       filter : [synonym] 
     filter : 
      synonym : 
       type : synonym 
       synonyms_path: synonyms.txt 

Potem stworzył test index:

"mappings" : { 
    "test" : { 
    "properties" : { 
     "text_1" : { 
      "type" : "string", 
      "analyzer" : "synonym" 
     }, 
     "text_2" : { 
      "search_analyzer" : "standard", 
      "index_analyzer" : "synonym", 
      "type" : "string" 
     }, 
     "text_3" : { 
      "type" : "string", 
      "analyzer" : "synonym" 
     } 
    } 
    } 

}

i insrted test typu z tych danych:

{ 
"text_3" : "foo dog cat", 
"text_2" : "foo dog cat", 
"text_1" : "foo dog cat" 
} 

synonyms.txt zawiera "foo, bar, baz", i kiedy szukać foo zwraca czego się spodziewałem, ale kiedy szukać baz lub bar powrót zerowe wyniki:

{ 
"query":{ 
"query_string":{ 
    "query" : "bar", 
    "fields" : [ "text_1"], 
    "use_dis_max" : true, 
    "boost" : 1.0 
}}} 

wynik:

{ 
"took":1, 
"timed_out":false, 
"_shards":{ 
"total":5, 
"successful":5, 
"failed":0 
}, 
"hits":{ 
"total":0, 
"max_score":null, 
"hits":[ 
] 
} 
} 

Odpowiedz

17

Nie wiem, jeśli twoim problemem jest to, że źle zdefiniowałeś synonimy "bar". Jak już powiedziałeś, jesteś całkiem nowy, zamierzam podać przykład podobny do twojego, który działa. Chcę pokazać, jak elasticsearch radzi sobie z synonimami w czasie wyszukiwania i w czasie indeksowania. Mam nadzieję, że to pomoże.

Pierwsza rzecz utworzenia pliku synonim:

foo => foo bar, baz 

Teraz utworzyć indeks z poszczególnymi ustawieniami próbują testu:

curl -XPUT 'http://localhost:9200/test/' -d '{ 
    "settings": { 
    "index": { 
     "analysis": { 
     "analyzer": { 
      "synonym": { 
      "tokenizer": "whitespace", 
      "filter": ["synonym"] 
      } 
     }, 
     "filter" : { 
      "synonym" : { 
       "type" : "synonym", 
       "synonyms_path" : "synonyms.txt" 
      } 
     } 
     } 
    } 
    }, 
    "mappings": { 

    "test" : { 
     "properties" : { 
     "text_1" : { 
      "type" : "string", 
      "analyzer" : "synonym" 
     }, 
     "text_2" : { 
      "search_analyzer" : "standard", 
      "index_analyzer" : "standard", 
      "type" : "string" 
     }, 
     "text_3" : { 
      "type" : "string", 
      "search_analyzer" : "synonym", 
      "index_analyzer" : "standard" 
     } 
     } 
    } 
    } 
}' 

Należy pamiętać, że musi synonyms.txt być w tym samym katalog, w którym plik konfiguracyjny od tej ścieżki jest względny względem katalogu konfiguracyjnego.

Indeks Teraz doc:

curl -XPUT 'http://localhost:9200/test/test/1' -d '{ 
    "text_3": "baz dog cat", 
    "text_2": "foo dog cat", 
    "text_1": "foo dog cat" 
}' 

Teraz wyszukiwań

Wyszukiwanie w tekst_1 pola

curl -XGET 'http://localhost:9200/test/_search?q=text_1:baz' 
{ 
    "took": 3, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 1, 
    "max_score": 0.15342641, 
    "hits": [ 
     { 
     "_index": "test", 
     "_type": "test", 
     "_id": "1", 
     "_score": 0.15342641, 
     "_source": { 
      "text_3": "baz dog cat", 
      "text_2": "foo dog cat", 
      "text_1": "foo dog cat" 
     } 
     } 
    ] 
    } 
} 

dostać dokument, ponieważ baz jest synonimem foo iw czasie indeksu foo jest rozszerzany o synonimy:

Wyszukany w text_2 pola

curl -XGET 'http://localhost:9200/test/_search?q=text_2:baz' 

wynik:

{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 0, 
    "max_score": null, 
    "hits": [] 
    } 
} 

Nie rozumiem przeboje bo nie poszerzyć synonimy podczas indeksowania (standard analizator). A ponieważ szukam baz i baz nie znajduje się w tekście, nie mam żadnego wyniku.

Wyszukiwanie w text_3 pola

curl -XGET 'http://localhost:9200/test/_search?q=text_3:foo' 
{ 
    "took": 3, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 1, 
    "max_score": 0.15342641, 
    "hits": [ 
     { 
     "_index": "test", 
     "_type": "test", 
     "_id": "1", 
     "_score": 0.15342641, 
     "_source": { 
      "text_3": "baz dog cat", 
      "text_2": "foo dog cat", 
      "text_1": "foo dog cat" 
     } 
     } 
    ] 
    } 
} 

Uwaga: text_3 jest "Baz pies kot"

text_3 był indeksy bez zwiększania synonimy. Kiedy szukam foo, które ma "baz" jako jeden z synonimów, otrzymuję wynik.

Jeśli chcesz debugować można użyć _analyze końcowy na przykład:

curl -XGET 'http://localhost:9200/test/_analyze?text=foo&analyzer=synonym&pretty=true' 

wynik:

{ 
    "tokens": [ 
    { 
     "token": "foo", 
     "start_offset": 0, 
     "end_offset": 3, 
     "type": "SYNONYM", 
     "position": 1 
    }, 
    { 
     "token": "baz", 
     "start_offset": 0, 
     "end_offset": 3, 
     "type": "SYNONYM", 
     "position": 1 
    }, 
    { 
     "token": "bar", 
     "start_offset": 0, 
     "end_offset": 3, 
     "type": "SYNONYM", 
     "position": 2 
    } 
    ] 
} 
Powiązane problemy