elasticsearch 使用Elasticsearch按搜索词顺序进行子字符串匹配,elasticsearch,substring,n-gram,elasticsearch,Substring,N Gram" /> elasticsearch 使用Elasticsearch按搜索词顺序进行子字符串匹配,elasticsearch,substring,n-gram,elasticsearch,Substring,N Gram" />

elasticsearch 使用Elasticsearch按搜索词顺序进行子字符串匹配

elasticsearch 使用Elasticsearch按搜索词顺序进行子字符串匹配,elasticsearch,substring,n-gram,elasticsearch,Substring,N Gram,我想使用弹性搜索执行子字符串/部分单词匹配。 我希望结果以适当的顺序返回。 为了解释我的问题,我将向您展示如何创建索引、映射以及我使用的记录 创建索引和映射: 批量记录插入: 现在,我想搜索en的剃须刀。我正在使用以下查询进行搜索: 我希望结果按以下顺序排列: 男士剃须刀->与以下相同搜索关键字最接近的匹配order en's shaver 女式剃须刀->与以下相同搜索关键字最匹配order en's shaver 男子箔式剃须刀->增加距离1 女式箔片剃须刀->距离增加1 男子花剑高级剃须刀-

我想使用弹性搜索执行子字符串/部分单词匹配。 我希望结果以适当的顺序返回。 为了解释我的问题,我将向您展示如何创建索引、映射以及我使用的记录

创建索引和映射:

批量记录插入:

现在,我想搜索en的剃须刀。我正在使用以下查询进行搜索:

我希望结果按以下顺序排列:

男士剃须刀->与以下相同搜索关键字最接近的匹配order en's shaver 女式剃须刀->与以下相同搜索关键字最匹配order en's shaver 男子箔式剃须刀->增加距离1 女式箔片剃须刀->距离增加1 男子花剑高级剃须刀->增加距离2 女式箔式高级剃须刀->增加2米距离 男士剃须刀->剃须刀的子串匹配 女式剃须刀->剃须刀的子串匹配 我正在执行以下查询。它没有按照我想要的顺序给我结果:

POST /my_index1/my_type1/_search
{
   "query": {
      "query_string": {
         "default_field": "text",
         "query": "men's shaver",
         "minimum_should_match": "90%"
      }
   }
}
请建议,如何达到上述效果?任何建议都会有帮助

***************************更新日期2014年5月6日******************************** 我做了一些改变: 1.喜欢使用多字段 2.仅使用一个碎片 3.使用分析、过滤和词干分析器

请参见下面的“我的设置”:

有关索引:

curl -XPUT "http://localhost:9200/my_improved_index" -d'
{
   "settings": {
        "analysis": {
            "filter": {
                "trigrams_filter": {
                    "type":     "ngram",
                    "min_gram": 1,
                    "max_gram": 50
                },
                 "my_stemmer" : {
                    "type" : "stemmer",
                    "name" : "minimal_english"
                }
            },
            "analyzer": {
                "trigrams": {
                    "type":      "custom",
                    "tokenizer": "standard",
                    "filter":   [
                        "standard",
                        "lowercase",
                        "trigrams_filter"
                    ]
                },
                "my_stemmer_analyzer":{
                    "type":      "custom",
                    "tokenizer": "standard",
                    "filter":   [
                        "standard",
                        "lowercase",
                        "my_stemmer"
                    ]
                }
            }
        }
    }
}'
对于映射:

现有文件:

男士剃须刀 男士剃须刀 男士箔式剃须刀 男士箔式剃须刀 男士箔式剃须刀 男士箔式剃须刀 男士箔式高级剃须刀 norelco男士箔式高级剃须刀 查询:

返回结果:

男士剃须刀->正确 男士剃须刀->正确 男士箔式剃须刀->不正确 norelco男士箔式高级剃须刀->不正确 男士箔式高级剃须刀->不正确 男士箔式剃须刀->不正确。 预期结果:

男士剃须刀->精确短语匹配 男士剃须刀->零字距离+1复数 男士箔式剃须刀->1字距离 男士箔式剃须刀->1个单词距离+1个复数 男士箔式高级剃须刀->2字距离 norelco男士箔式高级剃须刀->2字距离 为什么距离越远的文档得分越高? 如何达到这个效果?
词干分析器或nGram设置有问题吗?

我可以知道你在使用nGram分析器吗???@BlackPOP:我在使用nGram分析器获取更多搜索词关键字的组合。例如,要搜索男士/en,两者都应该是可搜索的。是的,另一个帖子也是我写的。但两者都有各自的问题需要解决。我想你可以在这里使用相同的方法。。对于使用通配符或regexp的未分析字段…@BlackPOP:使用未分析字段在这里没有帮助。我尝试使用span near查询,它可以返回结果3到6之间的顺序距离结果,但它不返回任何内容,可能是因为它的字段设置为“未分析”。我尝试使用查询字符串搜索query:men's shaver,但它返回的序列不正确。返回的结果是->1。男士剃须刀2。女士剃须刀等等。预期结果->1。男士剃须刀2。男士箔式剃须刀。一旦所有男人的记录都完成了,女人的成绩就会显示出来。我想多个领域可能对我有帮助。我试试看。
POST /my_index1/my_type1/_search
{
    "query": {
       "match": {
          "text": 
          { "query": "en's shaver",

            "minimum_should_match": "100%"

          }
       }

    }
}
POST /my_index1/my_type1/_search
{
   "query": {
      "query_string": {
         "default_field": "text",
         "query": "men's shaver",
         "minimum_should_match": "90%"
      }
   }
}
curl -XPUT "http://localhost:9200/my_improved_index" -d'
{
   "settings": {
        "analysis": {
            "filter": {
                "trigrams_filter": {
                    "type":     "ngram",
                    "min_gram": 1,
                    "max_gram": 50
                },
                 "my_stemmer" : {
                    "type" : "stemmer",
                    "name" : "minimal_english"
                }
            },
            "analyzer": {
                "trigrams": {
                    "type":      "custom",
                    "tokenizer": "standard",
                    "filter":   [
                        "standard",
                        "lowercase",
                        "trigrams_filter"
                    ]
                },
                "my_stemmer_analyzer":{
                    "type":      "custom",
                    "tokenizer": "standard",
                    "filter":   [
                        "standard",
                        "lowercase",
                        "my_stemmer"
                    ]
                }
            }
        }
    }
}'
curl -XPUT "http://localhost:9200/my_improved_index/my_improved_index_type/_mapping" -d'
{
    "my_improved_index_type": {
      "properties": {
         "name": {
            "type": "multi_field",
            "fields": {
               "name_gram": {
                  "type": "string",
                  "analyzer": "trigrams"
               },
               "untouched": {
                  "type": "string",
                  "index": "not_analyzed"
               },
               "name_stemmer":{
                   "type": "string",
                   "analyzer": "my_stemmer_analyzer"
               }
            }
         }
      }
   }

}'
curl -XPOST "http://localhost:9200/my_improved_index/my_improved_index_type/_search" -d'
{
   "size": 30,
   "query": {
      "bool": {
         "should": [
            {
               "match": {
                  "name.untouched": {
                     "query": "men\"s shaver",
                     "operator": "and",
                     "type": "phrase",
                     "boost": "10"
                  }
               }
            },
            {
               "match_phrase": {
                  "name.name_stemmer": {
                     "query": "men\"s shaver",
                     "slop": 5
                  }
               }
            }
         ]
      }
   }
}'