原创

ES(elasticsearch) Java 分页查询且高亮(highlight HighlightBuilder)且&按照高亮多少来排序(order) 关键属性(score)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://lixuekai.blog.csdn.net/article/details/88413795

需求是酱紫的:

可以设置某些关键字高亮,可以设置n个高亮的关键字,然后最后的查询结果,按照符合高亮条件的个数来排序,即优先展示高亮字段多的。这个搜索结果是分页查询的。

先看下,设置完条件之后的查询语句:json格式的,可能有点长,重点就是最后的highlight的配置。

{
  "from" : 0,
  "size" : 50,
  "query" : {
    "bool" : {
      "must" : [
        {
          "query_string" : {
            "query" : "\" /usr/libexec/atrun)\" \"88555\" \"18:00:00\" \"85464\" \"CMD\" \"root\" \"newsyslog\"",
            "default_field" : "content",
            "fields" : [ ],
            "use_dis_max" : true,
            "tie_breaker" : 0.0,
            "default_operator" : "or",
            "auto_generate_phrase_queries" : false,
            "max_determinized_states" : 10000,
            "enable_position_increments" : true,
            "fuzziness" : "AUTO",
            "fuzzy_prefix_length" : 0,
            "fuzzy_max_expansions" : 50,
            "phrase_slop" : 0,
            "escape" : false,
            "split_on_whitespace" : true,
            "boost" : 1.0
          }
        }
      ],
      "filter" : [
        {
          "bool" : {
            "must" : [
              {
                "range" : {
                  "start_at" : {
                    "from" : 1552298160,
                    "to" : 1552300042,
                    "include_lower" : true,
                    "include_upper" : false,
                    "boost" : 1.0
                  }
                }
              }
            ],
            "disable_coord" : false,
            "adjust_pure_negative" : true,
            "boost" : 1.0
          }
        }
      ],
      "disable_coord" : false,
      "adjust_pure_negative" : true,
      "boost" : 1.0
    }
  },
  "highlight" : {
    "pre_tags" : [
      "<span class=\"highlight\">"
    ],
    "post_tags" : [
      "</span>"
    ],
    "order" : "score",
    "fields" : {
      "content" : {
        "fragment_size" : 1000
      }
    }
  }
}

前面的query里面的都是查询的条件的,可以按照各自需求自己设置,比如时间from to的设置,同时搜索一个字段里面的n个关键字的设置等等。

这个highlight里面设置的说明:

pre_tags和post_tags,这2个合起来是一个标签,用来包装高亮的关键字。

order是关键,这个就是加完高亮标签之后,然后按照标签多少来排序的。

fields则是设置要高亮的字段,里面的fragment_size则是设置高亮字段显示的最长长度。

看文字不好懂,看图就好说啦。下面图展示查询的结果以及传入的n个查询参数。

大师兄

然后查询的结果图:

大师兄

可以看到,一共查到48个,total字段值,还有就是max_score值10.9。然后,hits数组里面第一个的score值就是max_score。后面的依次变小。说明这个hits数组查询结果,是按照这个值递减的顺序排序的。对应到页面上,第一行就是这个数组0的值啦。

代码里面对highlight的设置:

大师兄

这里面需要传个字符串,“score”而不是“_score”,这个score由字符串转化成一个枚举类型,然后就按照这个字段的值order排序呢

大师兄

再看这个查询结果,取数组0的值来看下,里面有个highlightFields,里面存的是content字段的值,对应的fragments,他对符合条件的关键字,给加上了我们传进去的标签。哦,他还分词了,1800,在我们看来是一个词,但es给分成了18和00,并且都给加上了标签。

可能有的老铁说了,我也设置了,为啥结果不是预期的样子呢?

原因可能是不了解这个score(分数)值是怎么在这设置的。

先看下这个查询语句,和上面的差不多,就多了一个sort。

{
  "from" : 0,
  "size" : 50,
  "query" : {
    "bool" : {
      "must" : [
        {
          "query_string" : {
            "query" : "\" /usr/libexec/atrun)\" \"88555\" \"18:00:00\" \"85464\" \"CMD\" \"root\" \"newsyslog\"",
            "default_field" : "content",
            "fields" : [ ],
            "use_dis_max" : true,
            "tie_breaker" : 0.0,
            "default_operator" : "or",
            "auto_generate_phrase_queries" : false,
            "max_determinized_states" : 10000,
            "enable_position_increments" : true,
            "fuzziness" : "AUTO",
            "fuzzy_prefix_length" : 0,
            "fuzzy_max_expansions" : 50,
            "phrase_slop" : 0,
            "escape" : false,
            "split_on_whitespace" : true,
            "boost" : 1.0
          }
        }
      ],
      "filter" : [
        {
          "bool" : {
            "must" : [
              {
                "range" : {
                  "start_at" : {
                    "from" : 1552298160,
                    "to" : 1552300042,
                    "include_lower" : true,
                    "include_upper" : false,
                    "boost" : 1.0
                  }
                }
              }
            ],
            "disable_coord" : false,
            "adjust_pure_negative" : true,
            "boost" : 1.0
          }
        }
      ],
      "disable_coord" : false,
      "adjust_pure_negative" : true,
      "boost" : 1.0
    }
  },
  "sort" : [
    {
      "start_at" : {
        "order" : "asc",
        "unmapped_type" : "string"
      }
    }
  ],
  "highlight" : {
    "pre_tags" : [
      "<span class=\"highlight\">"
    ],
    "post_tags" : [
      "</span>"
    ],
    "order" : "score",
    "fields" : {
      "content" : {
        "fragment_size" : 1000
      }
    }
  }
}

在query里面多了一个sort的设置,按照start_at字段asc排序。

因为这个时候,查询结果,已经有了排序字段啦。所以,他就不去计算这个score值了,不给查询出来的每个结果打分啦。

大师兄

你把这个排序去掉,然后,他就会按照content字段去打分,然后按照这个score字段打分的值来排序,返回查询结果。

最后:

使用的是es5.6版本

使用的Spring Data Elasticsearch 3.0,这个源码有点毛病,比如ID的生成规则,给改了。

还有使用的这个es的索引的mapping等信息,content字段类型是text,然后就是使用了ik分词

{
  "state": "open",
  "settings": {
    "index": {
      "creation_date": "1552295229216",
      "number_of_shards": "3",
      "number_of_replicas": "0",
      "uuid": "p4aoDav2QuaV89L5CvP_lQ",
      "version": {
        "created": "5060699"
      },
      "provided_name": "ezs_log_2019-03-11"
    }
  },
  "mappings": {
    "message": {
      "_all": {
        "enabled": false
      },
      "properties": {
        "firm": {
          "type": "keyword"
        },
        "file": {
          "type": "keyword"
        },
        "logSearchLevel": {
          "type": "keyword"
        },
        "topic": {
          "type": "keyword"
        },
        "id": {
          "type": "text"
        },
        "source": {
          "type": "ip"
        },
        "start_at": {
          "type": "long"
        },
        "content": {
          "analyzer": "ik_max_word",
          "type": "text"
        },
        "key": {
          "type": "text",
          "fields": {
            "keyword": {
              "ignore_above": 256,
              "type": "keyword"
            }
          }
        }
      }
    }
  },
  "aliases": [],
  "primary_terms": {
    "0": 1,
    "1": 1,
    "2": 1
  },
  "in_sync_allocations": {
    "0": [
      "-RGEY80ORX-jm5jMD4hyHg"
    ],
    "1": [
      "gWYUT_sBTCmhFjtaqV4qwQ"
    ],
    "2": [
      "qh5eDAT-Tb6241m43LR2MA"
    ]
  }
}

 

文章最后发布于: 2019-03-12 10:16:41
展开阅读全文
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览