在Elasticsearch中按最接近的匹配得分

时间:2015-02-11 06:24:54

标签: ruby-on-rails ruby elasticsearch

我在Elasticsearch::Model模型上有ActiveRecord::Base,看起来像这样

class ArtistGroup < ActiveRecord::Base
  include Elasticsearch::Model
  include Elasticsearch::Model::Callbacks

  FT_REDIS_KEY = "agft"
  has_many :artists

  settings index: { number_of_shards: 5 } do
    mappings dynamic: 'false' do
      indexes :normalized_name, analyzer: 'english'
      indexes :name, analyzer: 'english'
    end
  end

  def as_indexed_json(options={})
    as_json(only: ['normalized_name', 'id', 'name'])
  end
....

当我按.search('haim')搜索时,我希望文档的名称为:&#34; Haim&#34;在其他人喜欢&#34; Haim&#34;的Danielle Haim之前先退回,如何通过最接近的匹配来控制ES查询得分?

1 个答案:

答案 0 :(得分:0)

Elasticsearch默认返回按相关性排序的结果(即每个文档的得分)。

计算此分数的方式基于一组基本规则以及一些特定于查询的规则。

Elasticsearch中使用的标准相似度算法称为术语频率/逆文档频率,或TF / IDF,它考虑了以下因素:

  • 学期频率:该字词在该字段中出现的频率如何?更多 通常,更相关。一个包含五个提及的字段 相同的术语比仅含有的术语更有可能相关 一提。
  • 反向文档频率:每个术语的频率 出现在索引中?越多,相关性越低。条款 许多文件中出现的重量都比较少见 条款。
  • 场长规范:场地有多长?它越长, 不太可能的是,该领域的文字将是相关的。一个条款 出现在一个简短的标题字段中的权重比在长内容字段中出现的相同术语更重要。

单个查询可以将TF / IDF分数与其他因素结合起来,例如短语查询中的术语“邻近度”或模糊查询中的术语相似度。

有关相关性的完整说明,请参阅此处:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/sorting.html