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
}
]
}