我对ElasticSearch很陌生,我下面有这个问题。
有这两个记录:
POST test/_doc/1
{
"id": 1,
"authors": [
{
"name": "Test Name",
"url": "/url/1/"
}
]
}
POST test/_doc/2
{
"id": 2,
"authors": [
{
"name": "Test Name",
"url": "/url/1/"
},
{
"name": "Another author",
"url": "/url/another/"
}
]
}
字符串
这个查询:
GET test/_search
{
"query": {
"function_score": {
"query": {
"bool": {
"should": [
{
"match_phrase": {
"authors.name": {
"_name": "exact match in authors",
"query": "Test Name",
"boost": 100,
"slop": 1
}
}
}
]
}
}
}
}
}
型
为什么当有多个作者时,分数会降低?我如何才能使它更高或与只有一个作者的记录相同?
{
...
"hits": {
"max_score": 42.221836,
"hits": [
{
"_score": 42.221836,
"_source": {
"id": 1,
"authors": [
{
"name": "Test Name",
"url": "/url/1/"
}
]
},
"matched_queries": [
"exact match in authors"
]
},
{
"_score": 32.088596,
"_source": {
"id": 2,
"authors": [
{
"name": "Test Name",
"url": "/url/1/"
},
{
"name": "Another author",
"url": "/url/another/"
}
]
},
"matched_queries": [
"exact match in authors"
]
}
]
}
}
型
我在文件上找不到任何关于这个的东西。
下面的详细信息只是为了确保stackoverflow不会显示以下错误:It looks like your post is mostly code; please add some more details.
2条答案
按热度按时间kqqjbcuj1#
TLDR;
这是因为你的第二个文件有一个较长的字段。你可能不习惯看:
去理解
这是什么意思?
Elasticsearch在处理一个文档数组时,会像这样存储它们:
最初:
字符串
收件人:
型
而文档得分的计算采用TF/IDF,但TF与文档长度有关。
authors.name
的长度为% 2authors.name
的长度为4调查:
你可以使用API _explain:
型
这将给你给予以下结果:
文档1
型
文档2
型
修复
常量评分
如果你仍然想要一个分数,你可能想看看
constant_score
查询:型
过滤而不是应该?
如果你使用过滤器,匹配的文档不会影响分数:
型
o4tp2gmn2#
我尝试了@paulo解决方案,但它并不完全适合我,所以我最终添加了一个嵌套字段:
字符串
并使用此查询:
型
ElasticSearch文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html
经过这些修改后,它工作得很好!