Как найти похожие теги из текста с помощью поиска elasti c - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь использовать Elastic Search, чтобы найти большинство похожих тегов из текста.

Например, я создаю test_index и вставляю два документа:

POST test_index/_doc/17
{
  "id": 17,
  "tags": ["it", "devops", "server"]
}

POST test_index/_doc/20
{
  "id": 20,
  "tags": ["software", "hardware"]
}

Итак, я ожидаю найти Тег " software " (текст или идентификатор) из текста ", который я использую для некоторых программ и приложений ".

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

Спасибо.

Ответы [ 2 ]

2 голосов
/ 20 марта 2020

То, что вы ищете, это не что иное, как концепция, называемая Stemming. Вам нужно будет создать Custom Analyzer и использовать Stemmer Token Filter .

Пожалуйста, найдите приведенное ниже отображение, примеры документов, запрос и ответ:

Отображение:

PUT my_stem_index
{
  "settings": {
      "analysis" : {
          "analyzer" : {
              "my_analyzer" : {
                  "tokenizer" : "standard",
                  "filter" : ["lowercase", "my_stemmer"]
              }
          },
          "filter" : {
              "my_stemmer" : {
                  "type" : "stemmer",
                  "name" : "english"
              }
          }
      }
  },
  "mappings": {
    "properties": {
      "id":{
        "type": "keyword"
      },
      "tags":{
        "type": "text",
        "analyzer": "my_analyzer",
        "fields": {
          "keyword":{
            "type": "keyword"
          }
        }
      }
    }
  }
}

Из комментариев выясняется, что вы используете версию <7. Для что вам, возможно, придется добавить <code>type в него.

PUT my_stem_index
{
   "settings":{
      "analysis":{
         "analyzer":{
            "my_analyzer":{
               "tokenizer":"standard",
               "filter":[
                  "lowercase",
                  "my_stemmer"
               ]
            }
         },
         "filter":{
            "my_stemmer":{
               "type":"stemmer",
               "name":"english"
            }
         }
      }
   },
   "mappings":{
      "_doc":{
         "properties":{
            "id":{
               "type":"keyword"
            },
            "tags":{
               "type":"text",
               "analyzer":"my_analyzer",
               "fields":{
                  "keyword":{
                     "type":"keyword"
                  }
               }
            }
         }
      }
   }
}

Образцы документов:

POST my_stem_index/_doc/17
{
  "id": 17,
  "tags": ["it", "devops", "server"]
}

POST my_stem_index/_doc/20
{
  "id": 20,
  "tags": ["software", "hardware"]
}

POST my_stem_index/_doc/21
{
  "id": 21,
  "tags": ["softwares and applications", "hardwares and storage devices"]
}

Запрос запроса:

POST my_stem_index/_search
{
  "query": {
    "match": {
      "tags": "software"
    }
  }
}

Ответ:

{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.5908618,
    "hits" : [
      {
        "_index" : "my_stem_index",
        "_type" : "_doc",
        "_id" : "20",
        "_score" : 0.5908618,
        "_source" : {
          "id" : 20,
          "tags" : [
            "software",
            "hardware"
          ]
        }
      },
      {
        "_index" : "my_stem_index",
        "_type" : "_doc",
        "_id" : "21",
        "_score" : 0.35965496,
        "_source" : {
          "id" : 21,
          "tags" : [
            "softwares and applications",             <--- Note this has how `softwares` also was searchable.
            "hardwares and storage devices"
          ]
        }
      }
    ]
  }
}

Обратите внимание, как оба появляются документы, имеющие _id 20 и 21.

Дополнительное примечание:

Если вы новичок в Elasticsearch, я бы посоветовал потратить некоторое время на то, чтобы понять концепцию Analysis и то, как Elasticsearch реализует то же самое с помощью Analyzers.

Это поможет вам понять, как документ с softwares and applications также возвращается, когда вы запрашиваете только software и наоборот.

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

0 голосов
/ 21 марта 2020

Если вы ищете текст, который имеет базовое или root слово, Stemming является хорошим способом.

Если вам нужно найти наиболее похожие слова из текста, Ngram является более подходящим способом .

Если вы ищете точные слова текста в слове тегов, Shingles - лучший способ.

...