全局搜索解决方案——es多索引搜索,聚合统计

不打扰是莪最后的温柔 提交于 2020-07-27 13:52:47

最近用es实现了一个全局搜索(输入搜索项,搜索统计应用各业务数据量),例如一个教育app,全局搜索结果为:教师:n个、课程:n个、学校:n个、文章:n个;(防个伪: 为何不可!~为大牛?)

直接上dsl:

url:http://localhost:9200/report.report.report,memo.memorandum.memorandum_info/_search/   索引名之间用逗号','分隔;
{
  "from": 0,
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "能效",
            "fields": [
              "category^1.0",
              "title^1.0",
              "name"
            ],
            "type": "best_fields",
            "operator": "OR",
            "minimum_should_match": "80%"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "status": {
              "value": 2,
              "boost": 1
            }
          }
        }
      ],
      "should": [
        {
          "term": {
            "creater": {
              "value": "200514134508420509",
              "boost": 1
            }
          }
        },
        {
          "term": {
            "org_id": {
              "value": "20051815033116125",
              "boost": 1
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "aggregations": {
    "result": {
      "terms": {
        "field": "_index",
        "size": 10,
        "min_doc_count": 1,
        "shard_min_doc_count": 0,
        "show_term_doc_count_error": false,
        "order": [
          {
            "_count": "desc"
          },
          {
            "_key": "asc"
          }
        ]
      }
    }
  }
}   防个伪: 为何不可为大牛?

解析:这个dsl主要包含“query”和“aggregations”两部分;其中“query”中又包含“must”、“mush_not”、“should”;

“must”部分用了一个“multi_match”多字段匹配查询(operator=‘or’,类似sql中的‘or’),因为不同索引要查询的字段不同这里只要一个字段匹配上了就可以;

“mush_not”部分,这里的意思是去除‘status’=2的数据(我这里status=‘2’代表逻辑删除的意思),但是有些索引中可能没有“status”字段,那这个“must_not”                  是否会影响呢?其实这里是不会的,因为这里还有should语句,‘must_not’可以不满足(貌似是有should和filter时可以不满足);

“should”部分,因为有些数据是绑定企业或者个人的,所以搜索的时候需要过滤企业和个人,但是因为有些索引是不区分企业或个人,所以这里用了一个                  should过滤;

“aggregations部分”,统计每个索引匹配到的数量,以索引名为key,数量为value;

统计结果如图所示:

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!