当我在Elasticsearch上索引文档时,我正在使用词干分析器(用于巴西葡萄牙语)。这就是我的默认分析器的样子(这里有很小的错误,因为我已经从服务器的代码中手动复制了这个错误):
"analysis":{
"filter":{
"my_asciifolding": {
"type":"asciifolding",
"preserve_original":true,
},
"stop_pt":{
"type": "stop",
"ignore_case": true,
"stopwords": "_brazilian_"
},
"stemmer_pt":{
"type":"stemmer",
"language":"brazilian"
}
},
"analyzer":{
"default":{
"type":"custom",
"tokenizer":"standard",
"filter":{
"lowercase",
"my_asciifolding",
"stop_pt",
"stemmer_pt"
}
}
}
}
我还没有真正触及我的类型映射(除了我声明"type":"long"
的几个数字字段之外)所以我希望大多数字段都使用我已经指定的默认分析器上方。
这可以按预期工作,但问题是某些用户感到沮丧,因为(因为代码被阻止),查询"vulnerabilities"
和查询"vulnerable
&# 34;返回相同的结果,这会产生误导,因为他们希望将具有完全匹配的结果排在第一位。
什么是弹性搜索中的默认方式(如果有的话)? (也许保留索引中的未受干扰的令牌以及带有令牌的令牌?)我使用的是版本1.5.1。
答案 0 :(得分:0)
我最终使用"fields"
字段以不同方式索引我的属性。不确定这是否是最佳的,但这是我现在正在处理的方式:
添加另一个分析器(我称之为"no_stem_analyzer"
),其中包含"default"
分析器具有的所有过滤器,减去"stemmer"
。
对于我想要保留非词干和词干变体的每个属性,我都这样做了(字段"DESCRIPTION"
的示例):
"mappings":{
"_default_":{
"properties":{
"DESCRIPTION":{
"type"=>"string",
"fields":{
"no_stem":{
"type":"string",
"index":"analyzed",
"analyzer":"no_stem_analyzer"
},
"stemmed":{
"type":"string",
"index":"analyzed",
"analyzer":"default"
}
}
}
},//.. other attributes here
}
}
在搜索时(使用query_string_query
)我还必须指明(使用字段"fields"
)我要搜索所有子字段(例如"DESCRIPTION.*"
)
我的方法也基于[这个答案]。(elasticsearch customize score for synonyms/stemming)