Локально-чувствительное хеширование - Elasticsearch

есть ли какой-либо плагин, позволяющий LSH на Elasticsearch? Если да, не могли бы вы указать мне место и немного рассказать мне, как его использовать? Благодаря

Изменить: Я узнал, что ES использует плагин MinHash. Как я могу сравнить документы друг с другом с этим? Что было бы хорошей настройкой для поиска дубликатов?

Ответ 1

  • Существует Elasticsearch MinHash Plugin. Вы можете использовать его для извлечения значения minhash каждый раз, когда вы индексируете документ и запрашиваете документ с помощью minhash позже.

    • Установите плагин MinHash:

      $ $ES_HOME/bin/plugin install org.codelibs/elasticsearch-minhash/2.3.1
      
    • Добавьте анализатор minhash при создании индекса:

      $ curl -XPUT 'localhost:9200/my_index' -d '{
        "index":{
          "analysis":{
            "analyzer":{
              "minhash_analyzer":{
                "type":"custom",
                "tokenizer":"standard",
                "filter":["minhash"]
              }
            }
          }
        }
      }'  
      
    • Поместите поле minhash_value в индексное отображение:

      $ curl -XPUT "localhost:9200/my_index/my_type/_mapping" -d '{
        "my_type":{
          "properties":{
            "message":{
              "type":"string",
              "copy_to":"minhash_value"
            },
            "minhash_value":{
              "type":"minhash",
              "minhash_analyzer":"minhash_analyzer"
            }
          }
        }
      }'
      
    • Значение minhash автоматически вычисляется при добавлении документа в индекс, который вы создали с помощью анализатора minhash.
    • а. Использовать больше похоже на этот запрос можно использовать для поиска типа "как" в поле minhash_value:

      GET /_search
      {
          "query": {
              "more_like_this" : {
                  "fields" : ["minhash_value"],
                  "like" : "KV5rsUfZpcZdVojpG8mHLA==",
                  "min_term_freq" : 1,
                  "max_query_terms" : 12
              }
          }
      }
      

      б. Вы также можете использовать нечеткий запрос, но он принимает запрос, отличающийся от результата на 2 (максимум).

      GET /_search
      {
          "query": {
             "fuzzy" : { "minhash_value" : "KV5rsUfZpcZdVojpG8mHLA==" }
          }
      } 
      

      Подробнее о нечетком запросе здесь.

  • Или вы можете создать хэш-значение вне elasicsearch (написать код для извлечения хеш-значения), и каждый раз, когда вы индексируете документ, вы можете запустить код и прикрепить значение хэша к индексу, который вы индексируете. И более поздний поиск с хэш-значением с помощью Больше похоже на этот запрос или Fuzzy запрос, как описано выше.
  • Наконец, вы можете написать плагин elasticsearch самостоятельно, как указано выше (что соответствует вашему алгоритму хеширования) и сделать тот же шаг выше.