elasticsearch 中的索引和搜索分析器:无法将准确的字符串作为第一个结果
index and searchs analysers in elastic search: troubles in hitting exact string as first result
我正在使用弹性搜索对维基百科的主题进行索引测试。
低于我的设置。
我期望的结果是第一个结果与确切的字符串匹配 - 特别是如果字符串仅由一个单词组成。
改为:
正在搜索 "g"
curl "http://localhost:9200/my_index/_search?q=name:g&pretty=True"
returns
[Changgyeonggung,Lopadotemachoselachogaleokranioleipsanodrimhypotrimmatosilphioparaomelitokatakechymenokichlephophattoperisteralektryonoptekephalliokklopeleiolagoiosiraiobaphetraganopterygon,..]作为第一个结果(是的,偶然发现时间!如果你好奇的话,那是一道希腊菜[http://nifty.works/about/BgdKMmwV6B3r4pXJ/]=:])[=15
我认为是因为结果比其他单词更 "G" 个字母..但是:
正在搜索 "google":
curl "http://localhost:9200/my_index/_search?q=name:google&pretty=True"
returns
[Googlewhack, IGoogle, Google+, Google, ..] 作为第一个结果,我希望 Google成为第一个。
我的设置有什么问题,如果存在则没有命中精确关键字?
出于此答案中建议的原因,我使用了索引和搜索分析器:[
设置
# make index with mapping
curl -X PUT localhost:9200/test-ngram -d '
{
"settings": {
"analysis": {
"analyzer": {
"index_analyzer": {
"type" : "custom",
"tokenizer": "lowercase",
"filter": ["asciifolding", "title_ngram"]
},
"search_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": ["standard", "lowercase", "stop", "asciifolding"]
}
},
"filter": {
"title_ngram" : {
"type" : "nGram",
"min_gram" : 1,
"max_gram" : 10
}
}
}
},
"mappings": {
"topic": {
"properties": {
"name": {
"type": "string",
"boost": 10.0,
"index": "analyzed",
"index_analyzer": "index_analyzer",
"search_analyzer": "search_analyzer"
}
}
}
}
}
'
这是因为相关性在默认情况下以不同的方式工作(检查关于 TF/IDF 的部分
https://www.elastic.co/guide/en/elasticsearch/guide/current/relevance-intro.html)
如果你想在结果的顶部有精确的术语匹配,同时也匹配子字符串等,你需要像这样将名称索引为多字段:
"name": {
"type": "string",
"index": "analyzed",
// other analyzer stuff here
"fields": {
"raw": { "type": "string", "index": "not_analyzed" }
}
}
然后在布尔查询中,您需要查询名称和 name.raw 并从 name.raw
提升结果
我正在使用弹性搜索对维基百科的主题进行索引测试。
低于我的设置。
我期望的结果是第一个结果与确切的字符串匹配 - 特别是如果字符串仅由一个单词组成。
改为:
正在搜索 "g"
curl "http://localhost:9200/my_index/_search?q=name:g&pretty=True"
returns [Changgyeonggung,Lopadotemachoselachogaleokranioleipsanodrimhypotrimmatosilphioparaomelitokatakechymenokichlephophattoperisteralektryonoptekephalliokklopeleiolagoiosiraiobaphetraganopterygon,..]作为第一个结果(是的,偶然发现时间!如果你好奇的话,那是一道希腊菜[http://nifty.works/about/BgdKMmwV6B3r4pXJ/]=:])[=15
我认为是因为结果比其他单词更 "G" 个字母..但是:
正在搜索 "google":
curl "http://localhost:9200/my_index/_search?q=name:google&pretty=True"
returns
[Googlewhack, IGoogle, Google+, Google, ..] 作为第一个结果,我希望 Google成为第一个。
我的设置有什么问题,如果存在则没有命中精确关键字?
出于此答案中建议的原因,我使用了索引和搜索分析器:[
设置
# make index with mapping
curl -X PUT localhost:9200/test-ngram -d '
{
"settings": {
"analysis": {
"analyzer": {
"index_analyzer": {
"type" : "custom",
"tokenizer": "lowercase",
"filter": ["asciifolding", "title_ngram"]
},
"search_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": ["standard", "lowercase", "stop", "asciifolding"]
}
},
"filter": {
"title_ngram" : {
"type" : "nGram",
"min_gram" : 1,
"max_gram" : 10
}
}
}
},
"mappings": {
"topic": {
"properties": {
"name": {
"type": "string",
"boost": 10.0,
"index": "analyzed",
"index_analyzer": "index_analyzer",
"search_analyzer": "search_analyzer"
}
}
}
}
}
'
这是因为相关性在默认情况下以不同的方式工作(检查关于 TF/IDF 的部分 https://www.elastic.co/guide/en/elasticsearch/guide/current/relevance-intro.html) 如果你想在结果的顶部有精确的术语匹配,同时也匹配子字符串等,你需要像这样将名称索引为多字段:
"name": {
"type": "string",
"index": "analyzed",
// other analyzer stuff here
"fields": {
"raw": { "type": "string", "index": "not_analyzed" }
}
}
然后在布尔查询中,您需要查询名称和 name.raw 并从 name.raw
提升结果