Правильный способ поиска пользователя по частичному имени пользователя или имени с использованием токенайзера ngram вasticsearch - PullRequest
0 голосов
/ 07 января 2020

Я хочу создать поисковый запрос для приложения для социальных сетей таким образом, чтобы пользователи могли искать других пользователей по имени или имени, даже вводя часть имени или имени пользователя с помощью asticsearch .

Например:

input: okma
result: {"username": "alokmahor", "name": "Alok Singh Mahor"} // partial match in username

input: m90
result: {"username": "ram9012", "name": "Ram Singh"} // partial match in username

input: shn
result: {"username": "r2020", "name": "Krishna Kumar"} // partial match with name  

После прочтения и воспроизведения этих ссылок я придумаю свое частичное решение, которое я не уверен, правильно ли это.

Я следовал
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html
Как искать часть слова с ElasticSearch

Мое решение

DELETE my_index

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 3,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "username":   { "type": "text", "analyzer": "my_analyzer"  },
      "name":   { "type": "text", "analyzer": "my_analyzer"  } 
    }
  }
}


PUT /my_index/_doc/1
{
  "username": "alokmahor",
  "name": "Alok Singh Mahor"
}

PUT /my_index/_doc/2
{
  "username": "ram9012",
  "name": "Ram Singh"
}

PUT /my_index/_doc/3
{
  "username": "r2020",
  "name": "Krishna Kumar"
}

GET my_index/_search
{
"query": {
    "multi_match": {
      "query": "shn",
      "analyzer": "my_analyzer",
      "fields": ["username", "name"]
    }
  }
}

каким-то образом это решение частично работает, и я не уверен, что это действительно правильный путь, как я понял после того, как начал играть в функции aorundasticsearch и копировать пример кода вставки. Поэтому, пожалуйста, предложите правильный путь или улучшение этого.

Вещи, которые не работают

// "sin" is not matching with "Singh" but "Sin" is matching and working.
GET my_index/_search
{
"query": {
    "multi_match": {
      "query": "sin",
      "analyzer": "my_analyzer",
      "fields": ["username", "name"]
    }
  }
}

1 Ответ

1 голос
/ 07 января 2020

Поэтому, пожалуйста, предложите правильный путь

Степень правильности может быть определена только вашим требованием. Вы можете продолжить уточнение, проверив все возможные варианты использования один за другим.

улучшение этого

Для проблемы, о которой вы упоминаете, где Sin соответствует, пока sin нет; это потому, что определенный анализатор не делает поиск нечувствительным к регистру. Для этого добавьте строчный фильтр в определение вашего анализатора, как показано ниже:

  "analyzer": {
    "my_analyzer": {
      "tokenizer": "my_tokenizer",
      "filter": [
        "lowercase"
      ]
    }
  }

Этот ответ может помочь вам понять больше при поиске без учета регистра.

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