为了构建搜索引擎,我一直在使用ElasticSearch,并且我有兴趣手动更改每个术语的IDF(反向文档频率)以匹配可以测量的IDF来自Google Books unigrams。
为了做到这一点,我计划做以下事情:
1)仅使用1个分片(因此不会为每个分片计算IDF,它们是"全局")
2)通过对索引中的每个文档运行此查询,获取每个术语的ttf
(总计术语频率,用于计算IDF)
curl -XGET 'http://localhost:9200/index/document/id_doc/_termvectors?pretty=true' -d '{
"fields" : ["content"],
"offsets" : true,
"term_statistics" : true
}'
3)使用Google Books unigram模型" rescale"每个学期ttf
。
问题是,一旦我找到了"提升"我必须为每个术语使用的因素,我如何在查询中使用它?
例如,让我们考虑一下这个例子
"query":
{
"bool":{
"should":[
{
"match":{
"title":{
"query":"cat",
"boost":2
}
}
},
{
"match":{
"content":{
"query":"cat",
"boost":2
}
}
}
]
}
}
这是否意味着术语" cat"的IDF将被提升/乘以2倍?
另外,如果不是搜索一个单词而是一个句子,会发生什么?这是否意味着每个单词的IDF将被提升2?
我尝试了解boost
参数(https://www.elastic.co/guide/en/elasticsearch/guide/current/query-time-boosting.html)和t.getBoost()
的作用,但这看起来有点令人困惑。
答案 0 :(得分:0)
在使用多个查询子句查询时使用提升,例如:
{
"bool":{
"should":[
{
"match":{
"clause1":{
"query":"query1",
"boost":3
}
}
},
{
"match":{
"clause2":{
"query":"query2",
"boost":2
}
}
},
{
"match":{
"clause3":{
"query":"query1",
"boost":1
}
}
}
]
}
}
在上面的查询中,这意味着clause1
比clause3
重要三倍,clause2
比clause2
重要两倍,它不是简单地乘以3
},2
,因为在计算分数时,因为分数有规范化。
如果您只使用boost
查询一个查询子句,那么它就没用了。
使用提升的使用方案:
使用标题和内容字段设置的一组页面文档。
您希望使用某些字词搜索标题和内容,并认为标题比内容搜索这些文件时。因此,您可以将标题查询条款设置为超过内容。例如,如果您的查询通过标题字段点击一个文档,而按内容字段点击一个文档,并且您想要先点击标题字段的文档到内容字段文档。所以提升可以帮助你做到这一点。