假设A
、B
、C
是同义词,我想定义B
是“更接近” A
比 C
所以当我搜索关键字A
时,在搜索结果中,A
排在第一位,B
排在第二位, >C
排在最后。
有什么帮助吗?
最佳答案
目前还没有搜索时间机制来区分同义词和源字段的匹配。这是因为,在编制索引时,字段的同义词会与原始术语一起放入倒排索引中,从而使所有单词都相同。
但这并不是说您不能在索引时施展魔法来收集您想要的信息。
使用两个分析器创建一个索引:一个带有同义词过滤器,一个没有。
PUT /synonym_test/
{
settings : {
analysis : {
analyzer : {
"no_synonyms" : {
tokenizer : "lowercase"
},
"synonyms" : {
tokenizer : "lowercase",
filter : ["synonym"]
}
},
filter : {
synonym : {
type : "synonym",
format: "wordnet",
synonyms_path: "prolog/wn_s.pl"
}
}
}
}
}
使用多字段映射,使感兴趣的字段被索引两次:
PUT /synonym_test/mytype/_mapping
{
"properties":{
"mood": {
"type": "multi_field",
"fields" : {
"syn" : {"type" : "string", "analyzer" : "synonyms"},
"no_syn" : {"type" : "string", "analyzer" : "no_synonyms"}
}
}
}
}
索引测试文档:
POST /synonym_test/mytype/1
{
mood:"elated"
}
在搜索时,提高字段中没有同义词的命中率。
GET /synonym_test/mytype/_search
{
query: {
bool: {
should: [
{ match: { "mood.syn" : { query: "gleeful", "boost": 3 } } },
{ match: { "mood.no_syn" : "gleeful" } }
]
}
}
}
结果 _score":0.2696457
搜索原始术语会返回更好的分数:
GET /synonym_test/mytype/_search
{
query: {
bool: {
should: [
{ match: { "mood.syn" : { query: "elated", "boost": 3 } } },
{ match: { "mood.no_syn" : "elated" } }
]
}
}
}
结果:_score":0.6558018,"
关于elasticsearch:我可以用 boost 定义同义词吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17334214/