当我在一个字段上搜索时,评分似乎没有考虑字段的长度(即文本较长的文档的评分与较短的文档相同,并且由于某种原因放在之前).不知道我做错了什么.
字段的索引如下:
"name": {
"type": "string",
"analyzer": "autocomplete"
},
"_alias": {
"type": "string",
"analyzer": "autocomplete"
}
Run Code Online (Sandbox Code Playgroud)
分析:
"autocomplete": {
"char_filter": [
"special_character_mapping"
],
"filter": [
"lowercase",
"autocomplete_filter"
],
"tokenizer": "whitespace"
}
Run Code Online (Sandbox Code Playgroud)
过滤:
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20
}
Run Code Online (Sandbox Code Playgroud)
查询1:
{
"query": {
"multi_match": {
"query": "brown fo",
"type": "most_fields",
"fields": [
"name",
"_alias"
],
"use_dis_max": true,
"tie_breaker": 1,
"minimum_should_match": "100%",
"analyzer": "standard"
}
}
}
Run Code Online (Sandbox Code Playgroud)
这会返回很多文档,如:
最后在第10位左右:
更不用说在第15个左右有一个文件(布朗狐狸树)也有一个别名"布朗",没有考虑到.
查询2:
{
"query": {
"multi_match": {
"query": "brown fo",
"type": "cross_fields",
"fields": [
"name",
"_alias"
],
"use_dis_max": true,
"tie_breaker": 1,
"minimum_should_match": "100%",
"analyzer": "standard"
}
}
}
Run Code Online (Sandbox Code Playgroud)
这会返回更好的结果:
第二和第三文件总是得分相同.第一个有一个别名"布朗",正确地在前面.
我尝试了各种multi_match类型和query_string,但结果是一样的.
如何获得文本较短的文件(lucene应该自己做?)在其他文件前面?
由于您的字段name和_alias已使用autocomplete分析器指定(请注意,由于您仅在索引时使用该分析器,因此您应该指定index_analyzer而不是analyzer),您的输入将是:
因此,对于您上面给出的所有输入文本,它是这样的:
棕色狐狸=> b, br, bro, brow, brown, browne, browned, f, fo,fox
棕色狐狸=> b, br, bro, brow, brown, browni, brownis, brownish, f, fo, fox, foxe,foxes
布朗尼=> b, br, bro, brow, brown, browny, f, fo,for
棕色狐狸=> b, br, bro, brow, brown, f, fo,fox
棕色狐狸树=> b, br, bro, brow, brown, f, fo, fox, t, tr, tre,tree
现在,当您brown fo使用standard分析器进行搜索时,搜索标记将是:brown和fo
正如您所看到的,标记brown和fo都出现在上面的所有搜索词中,因此它们基本上是等效的。唯一会影响评分(以及排序顺序)的是这些术语是否已在nameor_alias字段(或两者)中找到,以及type您正在使用什么 of 字段匹配。如果没有看到具体的文档,很难说,但您绝对应该尝试添加?explain=true到查询中,以更深入地了解评分的计算方式。
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |