后端 - elasticsearch 如何类似 sql 的 where 减少搜索范围,提高性能?

 

问题描述:

我的 doc 结构如下:

{
    "id":"sadhiuasdhuasi",
    "user_id":12,
    "content":"每个人都不得不面对这些问题。 在面对这种问题时, 可是,即使是这样,一天掉多少根头发的出现仍然代表了一定的意义。 一天掉多少根头发因何而发生? 那么, 带着这些问题,我们来审视一下一天掉多少根头发。 叔本华在不经意间这样说过,意志是一个强壮的盲人,倚靠在明眼的跛子肩上。这句话语虽然很短,但令我浮想联翩。 塞涅卡说过一句富有哲理的话,生命如同寓言,其价值不在与长短,而在与内容。我希望诸位也能好好地体会这句话。 既然如何, 既然如此, 问题的关键究竟为何? 那么, 从这个角度来看, 现在,解决一天掉多少根头发的问题,是非常非常重要的。 所以, 总结的来说, 对我个人而言,一天掉多少根头发不仅仅是一个重大的事件,还可能会改变我的人生。 一般来说, 在这种困难的抉择下,本人思来想去,寝食难安。 既然如此, 本人也是经过了深思熟虑,在每个日日夜夜思考这个问题。 我们都知道,只要有意义,那么就必须慎重考虑。 一天掉多少根头发,到底应该如何实现。 既然如何, 每个人都不得不面对这些问题。 在面对这种问题时, 从这个角度来看, 一天掉多少根头发因何而发生? 在这种困难的抉择下,本人思来想去,寝食难安。 所谓一天掉多少根头发,关键是一天掉多少根头发需要如何写。 我认为, 既然如此, 对我个人而言,一天掉多少根头发不仅仅是一个重大的事件,还可能会改变我的人生。 经过上述讨论, 经过上述讨论, 既然如此, 非洲曾经说过,最灵繁的人也看不见自己的背脊。这似乎解答了我的疑惑。 就我个人来说,一天掉多少根头发对我的意义,不能不说非常重大。 塞涅卡说过一句富有哲理的话,生命如同寓言,其价值不在与长短,而在与内容。这句话语虽然很短,但令我浮想联翩。 "
}

平均每个 doc 大小在 10KB 左右,这样的 doc 有 100w 个

我把他们导入到 es

搜索的时候,输入的 doc 也是在 10KB 大小,所以遇到了性能问题

6core 12GB的机器,一秒只能提供 4次搜索,也就是 QPS 只有 4

因为 search 的时候,可以限定 user_id,比如只搜索某个用户的 doc

所以,我该怎么做?限定 user_id 可以加快搜索吗?


图片.png

这个问题类似 segmentfault 搜索功能的 『只显示我的』,我想知道 segmentfault 是怎么实现的,这个 filter 操作是发生在 search 前,还是 search 后?

我知道 elasticsearch search 原理是『倒排索引』,所以我浅陋的认为,『倒排索引』是无法实现 search 前 filter 的。

因为只有 search 了才知道 user_id 是啥,才能 filter,所以我认为 elasticsearch 的 filter 是无法让 search 变快的,是吗?

比如我要把 search 限定在 user_id=1 的 docs 上,获得 top10,elasticsearch 是不是必须 search 所有 user 的,然后给出 top10,然后 filter user_id 不等于 1 的,发现不满 10 个继续 search,直到获取 top10 个为止?


 

第 1 个答案:

可以查阅官方文档 Query DSL 部分:

GET /_search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "content": "xxx" }}
      ],
      "filter": [ 
        { "term":  { "user_id": 123 }}
      ]
    }
  }
}

我们都知道Vue中mounted是子组件先于父组件,可是引入的vue-router后出现了变化,最外层的app.vue先完成了请问这怎么处理呢?