Поиск информации - Как я могу обработать поисковый запрос с одним словом, разбитым на несколько токенов - PullRequest
0 голосов
/ 03 ноября 2019

Я только новичок в поиске информации.

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

Допустим, я перевернул индекс следующих документов:

  1. Джек и Джилл хорошие друзья.
  2. Джек ушелна Аляску.
  3. Джилл живет в Нью-Йорке.

Теперь иметь инвертированный индекс - значит, что new и york проиндексированы как отдельные токены (при условиипросто в качестве примера, и НЛП не используется для обозначения Нью-Йорка как Местоположения)

token    count    location
jack      2          1,2
jill      2          1,2
new       1           3
york      1           3
alaska    1           4

Теперь для Query jack я получу местоположения 1,2, что хорошо.

Но для запроса Нью-Йорк (при условии, что запрос без пробела), как я могу получить Нью-Йорк из индекса, который будет иметь местоположение 3 (объединено).

А также для запроса ala ska (с пробелами), как я могу получить маркер alaska (без пробела в индексе) соответственно.

Любые предложения илилюбые конкретные алгоритмы, которые я пропускаю.

Я только начинающий в поиске информации.

Спасибо за вашу помощь.

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

For пример запроса newyork

Найдите все токены до предельного n, начиная с n ... затем ne .... затем new .... затем newy .. .. и т. д., аналогично ne .. ew ... wy..yo..or..rk ...,

, который, наконец, после объединения массива получит new и Йорк где-то ..

Аналогично запросу ala ska (разбил слово на пробел(ы)) * +1066 *

1 Ответ

0 голосов
/ 03 ноября 2019

Может быть, что-то подобное будет работать для вас:

Создание индекса с помощью специального анализатора ( ngram tokenizer) Читать о NGram Tokenizer

PUT /index
{
  "mappings": {
    "doc": {
      "properties": {
        "token": {
          "type": "text",
          "analyzer": "myanalyzer"
        },
        "location":{
          "type": "text"
        }
      }
    }
  },
  "settings": {
    "analysis": {
      "analyzer": {
        "myanalyzer": {
          "tokenizer": "my_tokenizer",
          "filter": []
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "token_chars": [
            "letter",
            "digit",
            "symbol",
            "punctuation"
          ],
          "min_gram": "3",
          "type": "ngram",
          "max_gram": "4"
        }
      }
    }
  }
}

Давайте POST новые документы

POST index/doc
{
  "token": "alaska",
  "location":[4]
}

POST index/doc
{
  "token": "york",
  "location":[3]
}

POST index/doc
{
  "token": "new",
  "location":[3]
}

POST index/doc
{
  "token": "jack",
  "location":[1,2]
}

 POST index/doc
 {
   "token": "jill",
   "location":[1,2]
 }

Поиск:

GET index/_search
{
  "query": {
    "match": {
      "token": "ala ska"
    }
  }
}

Результаты:

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1.9346048,
    "hits": [
      {
        "_index": "index",
        "_type": "doc",
        "_id": "z7hBMG4BXy8wPzqAcq-C",
        "_score": 1.9346048,
        "_source": {
          "token": "alaska",
          "location": [
            4
          ]
        }
      }
    ]
  }
}
...