Elasticsearch mac адресный поиск / отображение
Я не могу заставить поиск по MAC-адресу возвращать правильные результаты, когда я выполняю частичный поиск (половину октета). Я имею в виду, что если я ищу точный MAC-адрес, я получаю результаты, но если пытаюсь найти частичный поиск, например, "00:19:9", я ничего не получаю, пока не завершу октет.
Кто-нибудь может указать, какое отображение я должен использовать, чтобы индексировать его или какой-то поисковый запрос я должен использовать??
curl -XDELETE http://localhost:9200/ap-test
curl -XPUT http://localhost:9200/ap-test
curl -XPUT http://localhost:9200/ap-test/devices/1 -d '
{
"user" : "James Earl",
"macaddr" : "00:19:92:00:71:80"
}'
curl -XPUT http://localhost:9200/ap-test/devices/2 -d '
{
"user" : "Earl",
"macaddr" : "00:19:92:00:71:82"
}'
curl -XPUT http://localhost:9200/ap-test/devices/3 -d '
{
"user" : "James Edward",
"macaddr" : "11:19:92:00:71:80"
}'
curl -XPOST 'http://localhost:9200/ap-test/_refresh'
curl -XGET http://localhost:9200/ap-test/devices/_mapping?pretty
Когда я нахожу точные совпадения, я получаю их правильно....
curl -XPOST http://localhost:9200/ap-test/devices/_search -d '
{
"query" : {
"query_string" : {
"query":"\"00\\:19\\:92\\:00\\:71\\:80\""
}
}
}'
# RETURNS:
{
"took": 6,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.57534903,
"hits": [
{
"_index": "ap-test",
"_type": "devices",
"_id": "1",
"_score": 0.57534903,
"_source": {
"user": "James Earl",
"macaddr": "00:19:92:00:71:80"
}
}
]
}
}
ОДНАКО, я должен быть в состоянии соответствовать частичным поискам MAC-адресов, как это:
curl -XPOST http://localhost:9200/ap-test/devices/_search -d '
{
"query" : {
"query_string" : {
"query":"\"00\\:19\\:9\""
}
}
}'
# RETURNS 0 instead of returning 2 of them
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
Итак, какое отображение я должен использовать? Есть ли лучшая строка запроса для достижения этой цели? Кстати, в чем разница между использованием query_string и text?
2 ответа
После некоторых исследований я нашел и более простой способ заставить его работать.
Параметры запроса Elasticsearch иногда сбивают с толку, потому что у них так много вариантов...
- query_string: имеет полноценный поиск с множеством вариантов и подстановочных знаков.
- match: проще и не требует подстановочных знаков или других "продвинутых" функций. Это здорово использовать в окнах поиска, потому что шансы на его неудачу очень малы, если вообще не существуют.
Итак, что сказал. Это тот, который работает лучше всего в большинстве случаев и не требует настраиваемого отображения.
curl -XPOST http://localhost:9200/ap-test/devices/_search -d '
{
"query" : {
"match_phrase_prefix" : {
"_all" : "00:19:92:00:71:8"
}
}
}'
Похоже, вы вообще не определили отображение, что означает, что asticsearch будет угадывать ваши типы данных и использовать стандартные отображения.
Для поля macaddr это будет распознаваться как строка, и будет использоваться стандартный анализатор строк. Этот анализатор разбивает строку на пробелы и знаки пунктуации, оставляя вас с токенами, состоящими из пар чисел. например "00:19:92:00:71:80"
будет помечен на 00
19
92
00
71
80
, При поиске произойдет то же токенизация.
То, что вы хотите, это определить анализатор, который поворачивает "00:19:92:00:71:80"
в жетоны 00
00:
00:1
00:19
так далее...
Попробуй это:
curl -XPUT http://localhost:9200/ap-test -d '
{
"settings" : {
"analysis" : {
"analyzer" : {
"my_edge_ngram_analyzer" : {
"tokenizer" : "my_edge_ngram_tokenizer"
}
},
"tokenizer" : {
"my_edge_ngram_tokenizer" : {
"type" : "edgeNGram",
"min_gram" : "2",
"max_gram" : "17"
}
}
}
}
}'
curl -XPUT http://localhost:9200/ap-test/devices/_mapping -d '
{
"devices": {
"properties" {
"user": {
"type": "string"
},
"macaddr": {
"type": "string",
"index_analyzer" : "my_edge_ngram_analyzer",
"search_analyzer": "keyword"
}
}
}
}'
Поместите документы как прежде, затем ищите с запросом, определенно нацеленным на область:
curl -XPOST http://localhost:9200/ap-test/devices/_search -d '
{
"query" : {
"query_string" : {
"query":"\"00\\:19\\:92\\:00\\:71\\:80\"",
"fields": ["macaddr", "user"]
}
}
}'
Что касается вашего последнего вопроса, то text
запрос устарел.
Удачи!