这是我的堆栈:
我想在弹性搜索中索引几千种产品。这是我的映射:
mapping do
indexes :name, analyzer: 'snowball', boost: 100
indexes :description, analyzer: 'snowball'
end
不幸的是,搜索结果令人难以置信。通过搜索“club-mate”,第一个结果是“club-mate-c”。第二个结果是“俱乐部队友”。为什么“俱乐部队友”不适合“俱乐部队友”。 搜索结果按_score排序。没有其他的。
我感谢任何反馈。 我确信这只是一个配置问题。
答案 0 :(得分:2)
您几乎没有提供有关要编制索引的数据,数据统一程度或查询方式的信息。
可能的问题是,club
和mate
这两个词在您的数据集中并不常见,并且在您的分片中分布不均。
默认情况下,每个分片都会单独考虑术语频率,因此如果在一个分片上,您有club
,mate
3次,而在另一个分片上,您有club
,{ {1}},mate
一次,然后第二个分片可能会认为c
和club
比第一个分片更相关。
通常情况下,对于大量数据,术语频率甚至自身都不存在,因此这不再是一个问题。但是,对于少量数据,您可以看到类似的问题。
解决方案:
mate
添加到搜索参数中,这将在运行查询之前检查所有分片中的字词频率 注意: search_type=dfs_query_then_fetch
默认为search_type
而不是query_then_fetch
,因为通常情况下,您会有足够的数据来确保均匀的频率,并执行更好。
您可以在搜索参数中添加dfs_query_then_fetch
,以查看每个文档的分数是如何计算出来的,这样可以更好地解决问题。