Ответ 1
Я не знаю, если ваша проблема в том, что вы определили плохо синонимы для "bar". Как вы сказали, вы новичок, я собираюсь привести пример, похожий на ваш, который работает. Я хочу показать, как elasticsearch имеет дело с синонимами во время поиска и во время индекса. Надеюсь, что это поможет.
Сначала создайте файл синонима:
foo => foo bar, baz
Теперь я создаю индекс с конкретными настройками, которые вы пытаетесь проверить:
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"
}
}
}
}
}'
Обратите внимание, что файл synonyms.txt должен находиться в том же каталоге, что и файл конфигурации, так как этот путь относится к директории config.
Теперь проиндексируем 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"
}'
Теперь поиск
Поиск в поле text_1
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"
}
}
]
}
}
Вы получаете документ, потому что baz является синонимом foo и во время индекса foo расширяется с его синонимами
Поиск в поле text_2
curl -XGET 'http://localhost:9200/test/_search?q=text_2:baz'
результат:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
Я не получаю хиты, потому что я не расширил синонимы при индексировании (стандартный анализатор). И, поскольку я ищу базу, а база не в тексте, я не получаю никакого результата.
Поиск в поле text_3
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"
}
}
]
}
}
Примечание: text_3 - "собака baz dog"
text_3 были индексами без расширения синонимов. Поскольку я ищу foo, которые имеют "baz" как один из синонимов, я получаю результат.
Если вы хотите отлаживать, вы можете использовать конечную точку _analyze
, например:
curl -XGET 'http://localhost:9200/test/_analyze?text=foo&analyzer=synonym&pretty=true'
результат:
{
"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
}
]
}