我想知道,当将Postgres的全文搜索与Elasticsearch进行比较时,有经验的人是否能对我的奇怪结果有所了解。
我使用一对Rails应用程序对它们进行测试,每个应用程序都具有相同的模型(但使用不同的宝石、pg测试的“textacular”、es测试的“搜索踢”)和相同的测试数据:
# seeds.rb
def make_post(body)
{
title: 'A Post About Fruits',
body: body,
num_likes: 0
}
end
Post.destroy_all
Post.create([
make_post('I like apples.'),
make_post('I like bananas.'),
make_post('I like apples and bananas.'),
make_post('I like oranges.'),
make_post('I like.')
])
但当我对它们进行大量搜索时,这些结果在Postgres上似乎更有意义,有时对Elasticsearch更有意义,而且它们在行为上常常相互矛盾。在以下结果中,我列出了每个搜索项返回的前两个帖子,或者如果返回的全部内容为1个帖子或零:
搜索: ‘苹果’: pg: 1。“我喜欢苹果。”“我喜欢苹果和香蕉。” es:
“香蕉”:
pg: 1。“我喜欢香蕉。”2。“我喜欢苹果和香蕉。”
es: 1.‘我喜欢香蕉。’2。“我喜欢苹果和香蕉。”
‘苹果’和:
pg: 1。“我喜欢苹果。”“我喜欢苹果和香蕉。”
es: 1.“我喜欢苹果和香蕉。”
“苹果和香蕉”:
pg: 1。“我喜欢苹果和香蕉。”
es: 1.“我喜欢苹果和香蕉。”
“我喜欢苹果。”
pg: 1。“我喜欢苹果。”“我喜欢苹果和香蕉。”
es: 1.我喜欢苹果和香蕉。“我喜欢苹果。”
“‘app”:
pg:没有结果
es: 1.我喜欢苹果和香蕉。“我喜欢苹果。”
“应用程序”:
pg: 1。“我喜欢苹果。”“我喜欢苹果和香蕉。”
es: 1.我喜欢苹果和香蕉。“我喜欢苹果。”
我必须承认,这是与默认设置,我没有调优或使用自定义查询语法(做和vs or等)。
发布于 2017-08-22 13:19:55
您正在从Elasticsearch获得奇怪的结果,因为一些统计数据是在单个碎片中计算的,而不是在整个索引中计算的。通常这很好,因为大多数文档集合都很大,但是当一个碎片中只有几个文档时,这些统计数据就没有什么意义了。在您的例子中,我认为有问题的统计数据是avgFieldLength,它有助于tfNorm得分。尝试用一个碎片创建一个新的索引:
PUT /testindex
{
"settings": {
"index": {
"number_of_shards": 1
}
}
}
POST /testindex/doc/1
{
"body": "I like apples."
}
POST /testindex/doc/2
{
"body": "I like apples and bananas."
}
然后查询:
POST /testindex
{
"query": {
"query_string": {
"query": "apples"
}
}
那你应该看看军衔:
如果你想弄清楚排名是怎么回事,你可以用解释:
POST /testindex
{
"explain": true,
"query": {
"query_string": {
"query": "apples"
}
}
尽管如此,您不应该期望postgres搜索排名与elasticsearch排名相匹配。Elasticsearch使用归一化tf-以色列国防军得分,postgres不考虑文档频率或文档长度。有关更多信息,请参见此问题:Does PostgreSQL use tf-idf?
https://stackoverflow.com/questions/45788683
复制相似问题