Elasticsearch запрос префикса minhash с подстановочными знаками? - PullRequest
0 голосов
/ 28 марта 2019

У меня есть поле minhash, сгенерированное для некоторого текста (на основе алгоритма minhash), теперь мой вопрос: возможно ли каким-то образом дополнить или добавить запрос префикса с помощью символов подстановки?Поскольку проблема заключается в том, что значения хэшированной строки основаны на содержании (тексте) позиции shingles / tokens.Поэтому первые несколько символов (префикс) могут не всегда точно совпадать с похожим контентом.Можно ли добавить подстановочный знак, например, * 3AF8659GJ перед префиксом для запроса?

РЕДАКТИРОВАТЬ: я думаю, я не задумывался о проблеме.Различия в хеше могут быть где угодно в строке хеша (на основе различий в тексте в позиции содержимого разницы текста).Поэтому я думаю, что «лучшим» единственным способом было бы редактировать расстояние и некоторую пороговую величину.

Например, поместить все хеши в массив и отсортировать их в лексическом порядке (или как бы вы отсортировали шестнадцатеричные строки?), А затем высравнивайте только следующие k документов, пока не будет достигнут порог расстояния редактирования, и поместите дубликаты в отдельный массив.

1 Ответ

1 голос
/ 28 марта 2019

Поиск по суффиксам крайне нежелателен по причинам производительности, как объяснено в официальном документе :

Для предотвращения очень медленных запросов с подстановочными символами термин с подстановочными символами не должен начинаться с одного из символов подстановки * или?

Есть еще способ достичь того, что вы хотите, с помощью искусно созданного анализатора. Идея состоит в том, чтобы индексировать только конец minhash. Вы можете достичь этого, как описано ниже.

Сначала создайте индекс с помощью следующего анализатора:

PUT minhash-index
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "suffix": {
            "type": "custom",
            "tokenizer": "keyword",
            "filter": [
              "lowercase",
              "reverse",
              "substring",
              "reverse"
            ]
          }
        },
        "filter": {
          "substring": {
            "type": "edgeNGram",
            "min_gram": 1,
            "max_gram": 10
          }
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "minhash": {
          "type": "text",
          "analyzer": "suffix",
          "search_analyzer": "standard"
        }
      }
    }
  }
}

Идея suffix анализатора заключается в том, что он будет индексировать все суффиксы длины от 1 до 10 (вы можете решить индексировать более длинные суффиксы) для каждого minhash, который вы добавили в свой индекс.

Так, например, для minhash C50FD711C2C43287351892A4D82F44B055F048C46D2C54197AC1D1E921F11E6699C4057C4B93907518E6DCA51A672D3D3E419160DAE276CB7716D11B94D8C3BB2E4A591329B7AF973D17A7F9336342FFAAFD4D он будет индексировать все следующие суффиксы:

  • d
  • 4d
  • d4d
  • fd4d
  • afd4d
  • aafd4d
  • faffd4d
  • ffaafd4d
  • 2ffaafd4d
  • 42ffaafd4d

Тогда вы можете легко найти и найти вышеупомянутый minhash с помощью следующего запроса:

POST minhash-index/_search
{
  "query": {
    "match": {
      "minhash": "42FFAAFD4D"
    }
  }
}
...