既然已经了解了如何为索引的每个域设置相似度模型,接下来就了解如何根据需要来配置相似度模型的参数,不用担心,操作非常简单。我们所需要做的就是在索引settgings中添加similarity对象。例如,如下的配置文本(该样例已经保存在posts_custom_similarity.json文件中):
{
"settings" : {
"index" : {
"similarity" : {
"mastering_similarity" : {
"type" : "default",
"discount_overlaps" : false
}
}
}
},
"mappings" : {
"post" : {
"properties" : {
"id" : { "type" : "long", "store" : "yes",
"precision_step" : "0" },
"name" : { "type" : "string", "store" : "yes", "index" :
"analyzed", "similarity" : "mastering_similarity" },
"contents" : { "type" : "string", "store" : "no", "index"
: "analyzed" }
}
}
}
}
我们可以在索引中配置多个相似度模型,然而还是先把注意力集中到上面只配置一个模型的例子中。在例子中,我们定义了一个新的相似度模型,命名为mastering_similarity
,当然它是基于默认的TF/IDF模型。我们同时设置了模型的discount_overlaps
参数值为false。我们将该模型用于name域中。本节稍后将论述哪些属性可以用于不同的模型,先了解如何替换ElasticSearch的默认相似度模型。
为了替换系统默认的相似度模型,我们需要用到一个名为default
的配置参数。例如,如果我们希望将上面设置的mastering_similarity
模型设置为系统的默认相似度模型,就需要将前面的配置改为如下(整个样例配置保存在posts_default_similarity.json文件中):
{
"settings" : {
"index" : {
"similarity" : {
"default" : {
"type" : "default",
"discount_overlaps" : false
}
}
}
},
...
}
由于query norm
和coord
因子(两个因子的作用在第2章 强大的用户查询语言 DSL的Lucene默认的打分算法 有解析说明)在打分模型中是全局的,而且是从default
类型的相似度模型中取得,ElasticSearch允许用户按需自行修改。
为了能够修改这两个因子,我们需要定义另一个相似度模型参数,命名为base
。除了名字与default
参数不一样外,其用法并无二致。样例配置如下(整个样例保存在posts_base_similarity.json文件中):
{ "settings" : { "index" : { "similarity" : { "base" : { "type" : "default", "discount_overlaps" : false } } } }, ... }如果
base
相似度参数出现在配置中,ElasticSearch就会使用它配置的相似度模型来计算query norm
和coord
两个因子,而文档得分则可用其它的相似度模型来计算。
每个新添加的相似度模型可以根据需求来配置。ElasticSearch 允许用户不作任何配置使用default
和BM25相似度模型,因为他们是预先在系统中配置好的。如果是DFR和IB模型,我们需要配置才能使用他们。接下来来了解一下ElasticSearch提供了哪些相似度模型相关的参数。
使用TF/IDF相似度模型时,对用户开放的只有discount_overlaps
一个属性,属性默认值为true。默认情况下,tokens的位置增量值为0(即它们都是重叠在一起的),在计算文档得分时位置增量不会算在其中。如果我们希望位置增量用于文档得分,则需要配置discount_overlaps
属性值为true。 注:可以参考DefaultSimilarity.lengthNorm()方法的源码。
使用Okapi BM25相似度模型时,有如下的参数可以配置:
使用DFR相似度模型时,有如下的参数可以配置:
如果我们配置归一化参数值为除no外的其它值,我们需要设置归一化因子。归一化因子取决与我们选择的归一化方式。对于 h1 归一化方法,我们需要使用normalization.h1.c参数(float类型)。 对于 h2 归一化方法,我们需要使用normalization.h2.c参数(float类型)。对于 h3 归一化方法,我们需要使用normalization.h3.c参数(float类型)。对于 z 归一化方法,我们需要使用normalization.z.z参数(float类型)。下面的一段代码展示了相似度模型的配置样例:
"similarity" : {
"esserverbook_dfr_similarity" : {
"type" : "DFR",
"basic_model" : "g",
"after_effect" : "l",
"normalization" : "h2",
"normalization.h2.c" : "2.0"
}
}
使用IB相似度模型,我们可以配置如下的参数:
此外,我们还可以选择DFR相似度模型中使用的归一化因子,这里就不再赘述。下面的一段代码展示了相似度模型的配置样例:
"similarity" : {
"esserverbook_ib_similarity" : {
"type" : "IB",
"distribution" : "ll",
"lambda" : "df",
"normalization" : "z",
"normalization.z.z" : "0.25"
}
}