В Elasticsearch, как искать значение с амперсандом? Пробовал:Как найти амперсанд в Elasticsearch?
http://localhost:9200/my_index/_search?q=name:"procter \u0026 gamble"
В Elasticsearch, как искать значение с амперсандом? Пробовал:Как найти амперсанд в Elasticsearch?
http://localhost:9200/my_index/_search?q=name:"procter \u0026 gamble"
Существуют различные способы, но один из способов будет объявить строку как not_analyzed
в вашем отображении (см ниже), а затем искать точное значение, которое было проиндексирована.
curl -XPUT localhost:9200/tests -d '{
"mappings": {
"test": {
"properties": {
"name": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
}'
Теперь мы индексировать образец документа:
curl -XPUT localhost:9200/tests/test/1 -d '{"name":"procter & gamble"}'
И, наконец, ваш поисковый запрос будет возвращать документ, который вы ожидаете:
curl -XGET localhost:9200/tests/test/_search?q=name.raw:"procter %26 gamble"
UPDATE Вот еще один сложнее путь используя nGram
tokenizer, который будет индексировать все возможные маркеры длиной от 2 до 20 (произвольный выбор) ваших имен.
curl -XPUT localhost:9200/tests -d '{
"settings": {
"analysis": {
"analyzer": {
"ngram_analyzer": {
"tokenizer": "ngram_tokenizer",
"filter": [
"lowercase"
]
}
},
"tokenizer": {
"ngram_tokenizer": {
"type": "nGram",
"min_gram": 2,
"max_gram": 20
}
}
}
},
"mappings": {
"test": {
"properties": {
"name": {
"type": "string",
"index_analyzer": "ngram_analyzer",
"search_analyzer": "keyword"
}
}
}
}
}'
Тогда вы можете найти точное название, как и раньше
curl -XGET localhost:9200/tests/test/_search?q=name:"procter %26 gamble"
Или просто какой-то знак присутствует в вашем имени
curl -XGET localhost:9200/tests/test/_search?q=name:procter
curl -XGET localhost:9200/tests/test/_search?q=name:"procter %26"
curl -XGET localhost:9200/tests/test/_search?q=name:gamble
Я предполагаю, что это работает; однако я хотел бы найти документ для частичного имени, например, «procter», поэтому мне нужно, чтобы это поле было проанализировано. Чтобы избежать «если не найдено в name_analyzed, search in name_raw» логики, вы могли бы поделиться другими способами, о которых вы упомянули? – avj
Да, у меня точно есть nGram, а в то время как полный запрос имени (q = name: "procter% 26 gamble"), а также частичный без амперсанда (q = name: procter) работает, проблема в том, что частичная с амперсандом (GET/tests/test/_search? q = name: "procter% 26") нет. – avj
Я обновил отображение и добавил вместо этого ключевое слово 'search_analyzer'. Это делает трюк. Попробуйте. – Val