elasticsearch:我可以用boost定义同义词吗?

chr*_*yue 4 synonym elasticsearch

比方说A,B,C是同义词,我想定义B是"接近" AC

所以当我搜索关键字时A,在搜索结果中,A第一个B是第二个,第二个C是最后一个.

有帮助吗?

Pha*_*eek 6

没有搜索时机制(截至目前)来区分同义词和源字段上的匹配.这是因为,当索引时,字段的同义词被放置在原始术语旁边的倒排索引中,使所有单词保持相等.

这并不是说你不能在索引时做一些魔法来收集你想要的信息.

使用两个分析器创建索引:一个具有同义词过滤器,另一个没有.

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"
        }
      }
   }
  }
}
Run Code Online (Sandbox Code Playgroud)

使用多字段映射,以便将感兴趣的字段编入索引两次:

PUT /synonym_test/mytype/_mapping
{
   "properties":{
     "mood": {
       "type": "multi_field",
       "fields" : {
          "syn" : {"type" : "string", "analyzer" : "synonyms"},
          "no_syn" : {"type" : "string", "analyzer" : "no_synonyms"}
       }
     }
   }

}
Run Code Online (Sandbox Code Playgroud)

索引测试文档:

POST /synonym_test/mytype/1
{
  mood:"elated"
}
Run Code Online (Sandbox Code Playgroud)

在搜索时,提高场上命中的得分,没有同义词.

GET /synonym_test/mytype/_search
{
  query: {
    bool: {
      should: [
          { match: { "mood.syn" : { query: "gleeful", "boost": 3 } } },
          { match: { "mood.no_syn" : "gleeful" } }
      ]
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

结果_score":0.2696457

搜索原始术语会得到更好的分数:

GET /synonym_test/mytype/_search
{
  query: {
    bool: {
      should: [
          { match: { "mood.syn" : { query: "elated", "boost": 3 } } },
          { match: { "mood.no_syn" : "elated" } }
      ]
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

结果:_score":0.6558018,"

  • 我是误读了您的答案还是您正在增强同义词字段而不是非同义词字段?但你说你要推动非同义词领域? (2认同)