elasticsearch 如何使用弹性搜索从文本中查找类似标记,elasticsearch,lucene,text-mining,elasticsearch,Lucene,Text Mining" /> elasticsearch 如何使用弹性搜索从文本中查找类似标记,elasticsearch,lucene,text-mining,elasticsearch,Lucene,Text Mining" />

elasticsearch 如何使用弹性搜索从文本中查找类似标记

elasticsearch 如何使用弹性搜索从文本中查找类似标记,elasticsearch,lucene,text-mining,elasticsearch,Lucene,Text Mining,我尝试使用弹性搜索从文本中查找最相似的标记 例如,我创建test_索引并插入两个文档: POST test_index/_doc/17 { "id": 17, "tags": ["it", "devops", "server"] } POST test_index/_doc/20 { "id": 20, "tags": ["software", "hardware"] } 因此,我希望从“我正在使用一些软件和应用程序”文本中找到“软件”标记(文本或id) 我希望有人能提供一个

我尝试使用
弹性搜索
从文本中查找最相似的标记

例如,我创建test_索引并插入两个文档:

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

POST test_index/_doc/20
{
  "id": 20,
  "tags": ["software", "hardware"]
}
因此,我希望从“我正在使用一些软件和应用程序”文本中找到“软件”标记(文本或id)

我希望有人能提供一个例子,说明如何做到这一点,或者至少为我指明正确的方向


谢谢。

您所寻找的只是一个称为的概念。您需要创建一个并利用

请查找以下映射、示例文档、查询和响应:

映射: 从评论中可以看出,您使用的是版本<7。为此,您可能需要在其中添加
类型

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"
                  }
               }
            }
         }
      }
   }
}
样本文件: 请求查询: 答复:
{
"take":3,,
“超时”:false,
“_碎片”:{
“总数”:1,
"成功":一,,
“跳过”:0,
“失败”:0
},
“点击次数”:{
“总数”:{
“价值”:2,
“关系”:“情商”
},
“最高分数”:0.5908618,
“点击次数”:[
{
“_索引”:“my_stem_索引”,
“\u类型”:“\u单据”,
“_id”:“20”,
“_分数”:0.5908618,
“_来源”:{
“id”:20,
“标签”:[
“软件”,
“硬件”
]
}
},
{
“_索引”:“my_stem_索引”,
“\u类型”:“\u单据”,
“_id”:“21”,
“_分数”:0.35965496,
“_来源”:{
“id”:21,
“标签”:[

“软件和应用程序”您所寻找的只是一个称为的概念。您需要创建一个并利用它

请查找以下映射、示例文档、查询和响应:

映射: 从注释中可以看出,您正在使用版本<7。为此,您可能需要在其中添加
类型

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"
                  }
               }
            }
         }
      }
   }
}
样本文件: 请求查询: 答复:
{
"take":3,,
“超时”:false,
“_碎片”:{
“总数”:1,
"成功":一,,
“跳过”:0,
“失败”:0
},
“点击次数”:{
“总数”:{
“价值”:2,
“关系”:“情商”
},
“最高分数”:0.5908618,
“点击次数”:[
{
“_索引”:“my_stem_索引”,
“\u类型”:“\u单据”,
“_id”:“20”,
“_分数”:0.5908618,
“_来源”:{
“id”:20,
“标签”:[
“软件”,
“硬件”
]
}
},
{
“_索引”:“my_stem_索引”,
“\u类型”:“\u单据”,
“_id”:“21”,
“_分数”:0.35965496,
“_来源”:{
“id”:21,
“标签”:[

“软件和应用程序”,如果您搜索的文本有基本或根单词,
词干分析是一种很好的方法

如果您需要从文本中找到最相似的单词,
Ngram
是更合适的方法


如果您在word of tags中搜索文本的确切单词,
木瓦是更好的方法。

如果您搜索具有基本单词或根单词的文本,
词干分析是一种好方法

如果您需要从文本中找到最相似的单词,
Ngram
是更合适的方法


如果您在word of tags中搜索精确的文本单词,
Shingles
是更好的方法。

很抱歉我没有得到它,即使默认的analyzer
stanard
也为文本软件创建了一个标记
software
,那么为什么要使用词干标记,它不是词干文本。我认为OP中的问题不清楚。@es ENTU,如果您仔细注意的话,即使他搜索
软件
(单数),他也希望返回包含
软件的文档(复数)。另一个例子是,如果他搜索word
wait
,他应该会得到包含
waiting、waiting
等内容的文档也会被返回。我想这就是OP正在寻找的内容。@OpsterESNinja Kamal您的映射设置不起作用,它有问题,原因是:“未能解析映射[属性]:根映射定义有不支持的参数:[id:{type=keyword}][tags:{analyzer=my_analyzer,type=text,fields={keyword={type=keyword}}}],我正在使用6.8版本。@OpsterESNinja Kamal我发现问题原因,您没有编写文档类型“_doc”映射后,请编辑您的答案。谢谢you@alireza我已经在7.6 ES版本上测试了该解决方案。在第7版之后,
类型
已被弃用,因此默认类型将是
\u doc
。请将所有这些详细信息放在您下次提出的任何问题中,这样我们就可以很容易地给您答案。无论如何,我将更新my相应地回答。很抱歉,我没有得到它,即使默认的analyzer
stanard
也为文本软件创建了一个标记
软件
,那么为什么要使用词干标记,它不是词干文本。我认为OP的问题不清楚。@es enthu如果您仔细注意,他希望文档具有
软件
(复数)即使他搜索
软件
(单数)也要返回。另一个例子是,如果他搜索word
等待
,他应该会得到有
等待、等待
等的文档也要返回。我想这就是OP要找的。@optsteresninja Kamal您的映射设置不起作用,它有问题,原因是“:”无法分析映射[properties]:根映射定义有不支持的参数:[id:{type=keyword}][tags:{analyzer=my_analyzer,type=text,fields={keyword={type=keyword}}}],我正在使用6.8版本。@OpsterESNinja Kamal我发现问题原因,您没有编写文档类型“_doc”映射后,请编辑您的答案。谢谢you@alireza我已经在7.6 ES版本上测试了该解决方案。在第7版之后,
类型
已被弃用,因此默认类型将是
\u doc
。请将所有这些详细信息放在您下次提出的任何问题中,这样我们就可以很容易地给您答案。无论如何,我将更新m我相应地回答。
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"
          ]
        }
      }
    ]
  }
}