首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Postgres全文搜索和弹性搜索排名结果不同?

为什么Postgres全文搜索和弹性搜索排名结果不同?
EN

Stack Overflow用户
提问于 2017-08-21 02:46:35
回答 1查看 1.2K关注 0票数 3

我想知道,当将Postgres的全文搜索与Elasticsearch进行比较时,有经验的人是否能对我的奇怪结果有所了解。

我使用一对Rails应用程序对它们进行测试,每个应用程序都具有相同的模型(但使用不同的宝石、pg测试的“textacular”、es测试的“搜索踢”)和相同的测试数据:

代码语言:javascript
运行
复制
# 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:

  1. “我喜欢苹果和香蕉。”
  2. “我喜欢苹果。”

“香蕉”:

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等)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-22 13:19:55

您正在从Elasticsearch获得奇怪的结果,因为一些统计数据是在单个碎片中计算的,而不是在整个索引中计算的。通常这很好,因为大多数文档集合都很大,但是当一个碎片中只有几个文档时,这些统计数据就没有什么意义了。在您的例子中,我认为有问题的统计数据是avgFieldLength,它有助于tfNorm得分。尝试用一个碎片创建一个新的索引:

代码语言:javascript
运行
复制
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."
}

然后查询:

代码语言:javascript
运行
复制
POST /testindex
{
  "query": {
    "query_string": {
      "query": "apples"
    }
 }

那你应该看看军衔:

  1. 我喜欢苹果。
  2. 我喜欢苹果和香蕉。

如果你想弄清楚排名是怎么回事,你可以用解释:

代码语言:javascript
运行
复制
POST /testindex
{
  "explain": true,
  "query": {
    "query_string": {
      "query": "apples"
    }
 }

尽管如此,您不应该期望postgres搜索排名与elasticsearch排名相匹配。Elasticsearch使用归一化tf-以色列国防军得分,postgres不考虑文档频率或文档长度。有关更多信息,请参见此问题:Does PostgreSQL use tf-idf?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45788683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档