我正在关注弹性搜索的this教程。
两名员工有关于'价值为:
"关于":"我喜欢去攀岩"
"关于":"我喜欢收集摇滚专辑"
我运行以下查询:
GET / megacorp / employee / _search {"查询":{"匹配":{"关于":"摇滚乐"} }}
以上条目都会被退回,但令人惊讶的是得分相同:
" _score":0.2876821
不应该是第二个必须有更高的分数,因为它有'关于'价值包含' rock'和' coll'而第一个只包含'摇滚'?
答案 0 :(得分:2)
这完全取决于您使用的分析仪。如果您使用标准或英语分析仪,则结果是正确的。我建议您花一些时间使用elasticsearch的{{3}}来熟悉每个分析器如何影响您的文本。
顺便说一句,如果您希望第二个文档得分更高,请查看Analyze API。
答案 1 :(得分:1)
当我们搜索全文字段时,我们需要通过与之前相同的分析过程传递查询字符串我们索引一个文档,以确保我们以与索引中存在的条件相同的形式搜索术语。
分析过程通常包括规范化和标记化(字符串由标记化器标记为单独的术语)。
匹配查询:
如果对全文字段运行匹配查询,它将在执行搜索之前使用该字段的正确分析器分析查询字符串。它只是查找指定的单词。
因此,在匹配查询中,Elasticsearch会查找整个单独字词的出现次数:rock
或/和coll
。
您的第二个文档不包含单独的单词coll
,但与单词rock
匹配。
结论:这2个文档的_score
值相同(它们由相同的单词rock
匹配)
答案 2 :(得分:0)
Elasticsearch
在存储之前分析每个text
字段。默认分析器(standard analyzer)基于空格分割文本并将其缩小。分析过程的输出是一个令牌列表,用于匹配您的查询令牌。如果任何令牌完全匹配,则返回相关文档。这就是说,你的第二个文件不包含令牌col
,这就是为什么两个文件的得分相同的原因。
即使您构建自定义分析器并使用stemming,collect
这个词也不会被视为coll
。
您可以构建自定义分析器,您可以在其中指定标记长度为1个字符,然后Elasticsearch
会将每个单个字符视为标记,您可以搜索文档中是否存在任何字符。