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