как настроить путь синонимов в elasticsearch
Я довольно новичок в Elasticsearch и я хочу использовать синонимы, я добавил Эти строки в конфигурационный файл:
index :
analysis :
analyzer :
synonym :
type : custom
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" : "synonym",
"type" : "string"
},
"text_3" : {
"type" : "string",
"analyzer" : "synonym"
}
}
}
}
и insrted тест типа с этими данными:
{
"text_3" : "foo dog cat",
"text_2" : "foo dog cat",
"text_1" : "foo dog cat"
}
синонимы.txt содержит "foo, bar, baz", и когда я ищу foo, он возвращает то, что я ожидал, но когда я ищу baz или bar, он возвращает нулевые результаты:
{
"query":{
"query_string":{
"query" : "bar",
"fields" : [ "text_1"],
"use_dis_max" : true,
"boost" : 1.0
}}}
результат:
{
"took":1,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"failed":0
},
"hits":{
"total":0,
"max_score":null,
"hits":[
]
}
}
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"
}
}
}
}
}'
обратите внимание, что синонимы.тхт должны быть в том же каталоге, что и файл конфигурации, поскольку этот путь относится к конфигурационному каталогу.
теперь индекс 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"
}
}
]
}
}
вы получаете документ, потому что баз является синонимом 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 cat"
text_3 был индексами без расширения синонимы. Как я ищу foo, которые имеют "баз" как один из синонимов я получаю результат.
если вы хотите отладить, вы можете использовать _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
}
]
}