Какова лучшая конфигурация для запроса полного имени вasticsearch - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь настроить анализ поиска в Elasticsearch, и я попробовал много комбинаций без какого-либо успеха, и теперь я не знаю, возможно ли это:

Предположим, у меня 3 пользователя со следующим полным именем

  • Джон Доу
  • Джонатан Лебус
  • Джейн Доу

Набор текста:

  • Jo должен давать Джон Доу и Джонатан Лебус
  • Ja должен дать Джейн Доу
  • doe должен дать Джейн Доу и Джон Доу
  • doe john должен ПРОСТО дать Джон Доу , а не Джейн Доу

Возможен ли последний случай и какой должна быть конфигурация?

На самом деле у меня есть это:

 "analysis": {
                    "analyzer": {
                        "keyword_analyzer": {
                            "char_filter\"": [],
                            "filter": [
                                "lowercase",
                                "asciifolding",
                                "trim"
                            ],
                            "type": "custom",
                            "tokenizer": "keyword"
                        },
                        "edge_ngram_analyzer": {
                            "filter": [
                                "lowercase"
                            ],
                            "tokenizer": "edge_ngram_tokenizer"
                        },
                        "edge_ngram_search_analyzer": {
                            "tokenizer": "lowercase"
                        }
                    },
                    "tokenizer": {
                        "edge_ngram_tokenizer": {
                            "token_chars": [
                                "letter"
                            ],
                            "min_gram": "2",
                            "type": "edge_ngram",
                            "max_gram": "5"
                        }
                    }
                },

Спасибо

1 Ответ

0 голосов
/ 15 февраля 2019

Я определенно думаю, что ваш анализатор, вероятно, подходит для вашего случая использования. Я подозреваю, что вам нужна помощь во время запроса.

Я настроил свой индекс, используя ваши анализаторы, и создал поле, используя его:

PUT test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "keyword_analyzer": {
          "char_filter\"": [],
          "filter": [
            "lowercase",
            "asciifolding",
            "trim"
          ],
          "type": "custom",
          "tokenizer": "keyword"
        },
        "edge_ngram_analyzer": {
          "filter": [
            "lowercase"
          ],
          "tokenizer": "edge_ngram_tokenizer"
        },
        "edge_ngram_search_analyzer": {
          "tokenizer": "lowercase"
        }
      },
      "tokenizer": {
        "edge_ngram_tokenizer": {
          "token_chars": [
            "letter"
          ],
          "min_gram": "2",
          "type": "edge_ngram",
          "max_gram": "5"
        }
      }
    }
  },
  "mappings": {
    "test_doc": {
      "properties": {
        "full_name": {
          "type": "text",
          "analyzer": "edge_ngram_analyzer"
        }
      }
    }
  }
}

Затем я индексирую несколько документов:

PUT test/test_doc/1
{
  "full_name": "John Doe"
}

PUT test/test_doc/2
{
  "full_name": "Jane Doe"
}

PUT test/test_doc/3
{
  "full_name": "Johnatan Lebus"
}

И затем я использую следующий запрос для вашего последнего случая, в качестве примера.

GET test/_search
{
  "query": {
    "match": {
      "full_name": {
        "operator": "and",
        "query": "doe john"
      }
    }
  }
}

Заменаполе «запрос» с любым вашим текстом выше дает нам результаты, которые мы хотим.Настоящее «решение» вашей проблемы здесь - это быть немного более креативным во время запроса, хотя это и не представляется возможным с точки зрения токена.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...