Используйте множественный анализатор в эластичном поиске (автозаполнение и фонетический).

Алгоритм анализа хорошо работает в автозаполнении с нечетким соответствием, но нечеткое соответствие не так хорошо, поэтому я хотел добавить фонетический анализатор к тому же индексу фамилии. Я просмотрел много документации и не нашел хорошей о том, как использовать 2 анализатора.

  "settings": {
    "analysis": {
      "analyzer": {
        "autocomplete_analyzer": {
          "type": "custom",
          "tokenizer": "autocomplete_tokenizer",
          "filter": [
            "lowercase"
          ]
        },
        "phonetic_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "phonetic"
          ]
        }
      },
      "tokenizer": {
        "autocomplete_tokenizer": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 10,
          "token_chars": ["letter", "digit"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "full_name": {
        "type": "text",
        "analyzer": "autocomplete_analyzer"
      },
      "relation_name": {
        "type": "text",
      },
      "address": {
        "type": "text"
      }
    }
  }
}

Замысловатый ответ ...

Хотя использование нескольких анализаторов для одного поля невозможно (за исключением того, что вы можете использовать разные анализаторы при index или search), хитрый способ сделать это - использовать функцию copy_to в elasticsearch.

Поэтому вы можете добавить еще одно поле, например full_name_phonetic, как показано ниже, и при поиске запрашивать оба поля.

{
"mappings": {
    "properties": {
      "full_name_phonetic": {
        "type": "text",
        "analyzer": "phonetic_analyzer"
      },
      "full_name": {
        "type": "text",
        "copy_to": "full_name_phonetic"
        "analyzer": "autocomplete_analyzer"
      },
      "relation_name": {
        "type": "text",
      },
      "address": {
        "type": "text"
      }
    }
  }
}
Вернуться на верх