当前位置:   article > 正文

elasticsearch nested嵌套对象全文检索和排序_es根据nested排序

es根据nested排序

 

什么是 ES Nested 嵌套类型? Elasticsearch 有很多数据类型,大致如下:

  • 基本数据类型: string 类型。ES 7.x 中,string 类型会升级为:text 和 keyword。keyword 可以排序;text 默认分词,不可以排序。
  • 数据类型:integer、long 等 
  • 时间类型、布尔类型、二进制类型、区间类型等 
  • 复杂数据类型: 
  • 数组类型:Array 
  • 对象类型:Object Nested 类型 
  • 特定数据类型:地理位置、IP 等 注意:tring/nested/array 类型字段不能用作排序字段。因此 string 类型会升级为:text 和 keyword。keyword 可以排序,text 默认分词,不可以排序。

nested 类型是一种特殊的 [object,object] 类型. 这种类型允许对 object 数组内的元素进行单独查询,区别是:

  • object: Lucene 没有内部 object 的概念, 所以 Elasticsearch 内部会把 object 解析成简单的字段名与值的信息,就是所有字段平铺。 
  • nested: Elasticsearch 内部会把数组中的每个元素当成一个隐藏文档, 所以可以用 [query-dsl-nested-query,nested query] 

嵌套模型的优缺点如下:

  • 文档存储在一起,因此读取性能高
  • 如果新增丶修改或删除一个嵌套文档,则必须重新索引整个文档。因此越多嵌套文档造成越多的成本。

动态映射 字段数据类型不需要事先定义,ES内部自动映射默认字段类型。如果是object类型,数据同步时会把内部的text映射成text,还会带上keyowd的子类型。参考

嵌套类型搜索

object类型的filed会把text类型字段没有加上keyword,就是不分词。所以我们改成neatest类型。 因嵌套对象(nested objects)会被索引为分离的隐藏文档,我们不能直接查询它们。而是使用 nested查询或 nested 过滤器来存取它们:

  1. GET /my_index/blogpost/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. { "match": { "title": "eggs" }}, <1>
  7. {
  8. "nested": {
  9. "path": "comments", <2>
  10. "query": {
  11. "bool": {
  12. "must": [ <3>
  13. { "match": { "comments.name": "john" }},
  14. { "match": { "comments.age": 28 }}
  15. ]
  16. }}}}
  17. ]
  18. }}}

嵌套字段排序问题

  1. PUT /my_index/blogpost/2
  2. {
  3. "title": "Investment secrets",
  4. "body": "What they don't tell you ...",
  5. "tags": [ "shares", "equities" ],
  6. "comments": [
  7. {
  8. "name": "Mary Brown",
  9. "comment": "Lies, lies, lies",
  10. "age": 42,
  11. "stars": 1,
  12. "date": "2014-10-18"
  13. },
  14. {
  15. "name": "John Smith",
  16. "comment": "You're making it up!",
  17. "age": 28,
  18. "stars": 2,
  19. "date": "2014-10-16"
  20. }
  21. ]
  22. }

嵌套查询

  1. GET /_search
  2. {
  3. "query": {
  4. "nested": {
  5. "path": "comments",
  6. "filter": {
  7. "range": {
  8. "comments.date": {
  9. "gte": "2014-10-01",
  10. "lt": "2014-11-01"
  11. }
  12. }
  13. }
  14. }
  15. },
  16. "sort": {
  17. "comments.stars": {
  18. "order": "asc",
  19. "mode": "min",
  20. "nested_filter": {
  21. "range": {
  22. "comments.date": {
  23. "gte": "2014-10-01",
  24. "lt": "2014-11-01"
  25. }
  26. }
  27. }
  28. }
  29. }
  30. }

上面的方案在ES6.1之后是不行的,因为嵌套类型的排序有特殊的排序nested sort选项,开启的方式和netsed查询很像。所以我们升级了一下

  1. POST /_search
  2. {
  3. "query" : {
  4. "term" : { "product" : "chocolate" }
  5. },
  6. "sort" : [
  7. {
  8. "offer.price" : {
  9. "mode" : "avg",
  10. "order" : "asc",
  11. "nested": {
  12. "path": "offer",
  13. "filter": {
  14. "term" : { "offer.color" : "blue" }
  15. }
  16. }
  17. }
  18. }
  19. ]
  20. }

java代码的写法

  1. BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
  2. RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("custom_info.deptUpdateTime");
  3. rangeQueryBuilder.gte(condition.getDeptUpdateTime().getStartTime() + "T00:00:00");
  4. rangeQueryBuilder.lte(condition.getDeptUpdateTime().getEndTime() + "T23:59:59");
  5. boolBuilder.must(rangeQueryBuilder);
  6. QueryBuilder nestedQueryBuilder = new NestedQueryBuilder(
  7. "custom_info",
  8. boolBuilder,
  9. ScoreMode.None
  10. );

参考文档

netst——path

ElasticSearch的Nested(嵌套)数据类型

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/456812
推荐阅读
相关标签
  

闽ICP备14008679号