Индекс ElasticSearch против анализатора времени поиска - PullRequest
0 голосов
/ 31 мая 2018

Столкнувшись с проблемой, которая заставляет меня думать, что я не полностью понимаю анализ индекса и времени поиска в ElasticSearch 5.5.

Допустим, у меня есть базовый индекс для человека с name иstate.Для простоты я установил al => alabama в качестве единственного синонима состояния.

PUT people
{
  "mappings": {
    "person": {
      "properties": {
        "name": {
          "type": "text"
        },
        "state": {
          "type": "text",
          "analyzer": "us_state"
        }
      }
    }
  },
  "settings": {
    "analysis": {
      "filter": {
        "state_synonyms": {
          "type": "synonym",
          "synonyms": "al => alabama"
        }
      },
      "analyzer": {
        "us_state": {
          "filter": [
            "standard",
            "lowercase",
            "state_synonyms"
          ],
          "type": "custom",
          "tokenizer": "standard"
        }
      }
    }
  }
}

Насколько я понимаю, когда я индексирую документ, данные поля state будут проиндексированы как расширенная форма синонима.Это можно проверить, выполнив:

GET people/_analyze
{
  "text": "al",
  "field": "state"
}

, который возвращает

{
  "tokens": [
    {
      "token": "alabama",
      "start_offset": 0,
      "end_offset": 2,
      "type": "SYNONYM",
      "position": 0
    }
  ]
}

Выглядит хорошо, давайте индексировать документ:

POST people/person
{
  "name": "dave",
  "state": "al"
}

и выполнить поиск:

GET people/person/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "state": "al"
          }
        }
      ]
    }
  }
}

, который ничего не возвращает:

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}

Я бы ожидал, что al в моем поиске будет проходить через тот же us_state анализатор и совпадать с моим документом.Тем не менее, поиск работает, если я изменю свой запрос на:

"term": { "state": "alabama" }

1 Ответ

0 голосов
/ 31 мая 2018

Это потому, что вы использовали запрос term, который не анализирует входные данные.Вы должны изменить это, чтобы использовать match запрос вместо этого, и все будет хорошо

GET people/person/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "state": "al"
          }
        }
      ]
    }
  }
}
...