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" будет помечен на 001992007180, При поиске произойдет то же токенизация.

То, что вы хотите, это определить анализатор, который поворачивает "00:19:92:00:71:80" в жетоны 0000:00:100: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 запрос устарел.

Удачи!

Другие вопросы по тегам