elasticSearch DSL语句--java代码逻辑比较


yanran/ElasticSearch-demo (gitee.com)https://gitee.com/yanran00/elastic-search-demo

1. 查询结果分析

{

  "took" : 1,

  "timed_out" : false,

  "_shards" : {

    "total" : 1,

    "successful" : 1,

    "skipped" : 0,

    "failed" : 0

  },

  "hits" : {

    "total" : {

      "value" : 30,---------------------------response.getHits().getTotalHits().value [Long]

      "relation" : "eq"

    },

    "max_score" : 2.0645075,

    "hits" : [--------------------------------response.getHits().getHits() [array]

      {

        "_index" : "hotel",

        "_type" : "_doc",

        "_id" : "sP7vbYIBeL0jRZbFalKk",

        "_score" : 2.0645075,

        "_source" : {-------------------------response.getHits().getHits()[0].getSourceAsString() [json-String]

          "brand" : "如家",

          "id" : 339952837,

          "location" : "39.73167, 116.132482",

          "name" : "如家酒店(北京良乡西路店)",

          "price" : 159,

          "score" : 46,            

        },

        "highlight" : {-----------------------response.getHits().getHits()[0].getHighlightFields() [map]

          "name" : [------------------------(map)highlightFields.get("name").getFragments() [array]

            "<em>如家</em>酒店"

          ]

        },
       "sort" : [-----------------------response.getHits().getHits()[0].getSortValues();[Object[]]
                  3299,
                12395.153
        ]

      }

    ]

  }

}

2.  DSL语句分析 

- 简单查询 

2.1 查询所有


GET /hotel/_search
{-----------------searchRequest.source().query(QueryBuilders.matchAllQuery());
  "query": {
    "match_all": {}
  }
}

2.2 查询名称包含如家的文档,(会先分词再检索) 

GET /hotel/_search
{-----------------searchRequest.source().query(QueryBuilders.matchQuery("name","如家"));
  "query": {
    "match": {
      "name": "如家"
    }
  }
}

2.3 多条件查询 


GET /hotel/_search
{---------------------searchRequest.source().query(QueryBuilders.multiMatchQuery("如家", "name","brand"));
  "query": {
    "multi_match": {
      "query": "上海如家",
      "fields": ["brand","name","city"]
    }
  }
}

GET /hotel/_search
{--------------------------searchRequest.source().query(QueryBuilders.matchQuery("all","如家"));
  "query": {
    "match": {
      "all": "上海如家"
    }
  }
}

2.4 精确查询term/range


#term
GET /hotel/_search
{--------------------------searchRequest.source()
                                                    .query(QueryBuilders.termQuery("city", "北京"));
  "query": {
    "term": {
      "city": {
        "value": "北京"
      }
    }
  }
}

#range
GET /hotel/_search
{----------------------------searchRequest.source()
                                                    .query(QueryBuilders.rangeQuery("price").lte(1000).gte(900));
  "query": {
    "range": {
      "price": {
        "gte": 900,
        "lte": 1000
      }
    }
  }
}

 2.5 地理坐标查询

# 矩形地理坐标查询(geo_bounding_box)
GET /hotel/_search
{------------------------------searchRequest.source()                                                           .query(QueryBuilders.geoBoundingBoxQuery("location").setCorners("坐上", "右下"));
  "query": {
    "geo_bounding_box": {
      "location": {
        "top_left": {
          "lat": 31.1,
          "lon": 121.5
        },
        "bottom_right": {
          "lat": 30.9,
          "lon": 121.7
        }
      }
    }
  }
}
#附近查询,距离查询(geo_distance)
GET /hotel/_search
{---------------------------searchRequest.source()
    .query(QueryBuilders.geoDistanceQuery("location").distance(10,DistanceUnit.KILOMETERS));
  "query": {
    "geo_distance": {
      "distance": "15km", 
      "location": "31.21,121.5" 
    }
  }

- 复合查询 

2.6 算分查询 

# 算分函数查询,给上海酒店中的如家排名提前一些
# 三个点:

        原来的文档(function_score)、
        过滤出来的要加分的文档(filter)、
        如何加分(weight、boost——mode)dai

代码演示:

FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery(
        boolQuery,//目前的查询条件得到的doc
        new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                QueryBuilders.termQuery("isAD", true), //过滤条件
                ScoreFunctionBuilders.weightFactorFunction(10)//加分权重
        )})//权重与与原分数的计算方式
        .boostMode(CombineFunction.MULTIPLY);
searchRequest.source().query(functionScoreQuery);


 2.7 布尔查询 


GET /hotel/_search
{
  "query": {
    "bool": {---------------BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
      "must": [-------------boolQuery.must(QueryBuilders.termQuery("city", "上海"));
                                                        (后面可以继续链式编程)
        {
          "term": {
            "city": {
              "value": "上海"
            }
          }
        }
      ],
      "must_not": [----------boolQuery.mustNot(QueryBuilders.rangeQuery("price")
                                                                .lte(maxPrice).gte(minPrice));
        {
          "range": {
            "price": {
              "gte": 500
            }
          }
        }
      ],
      "should": [--------- boolQuery.should(QueryBuilders.termQuery("brand", "如家"))
                                        .should(QueryBuilders.termQuery("brand", "万怡"));
        {
          "term": {
            "brand": {
              "value": "如家"
            }
          }
        },
        {
          "term": {
            "brand": {
              "value": "万怡"
            }
          }
        }
      ],
      "filter": [---------boolQuery.filter(QueryBuilders.rangeQuery("score")
                                                                                    .gte(40));
        {
          "range": {
            "score": {
              "gte": 40
            }
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 20

2.8 查询结果排序

# 普通字段排序
GET /hotel/_search
{
  "query": {------------searchRequest.source().query(QueryBuilders.matchAllQuery());
    "match_all": {}
  }
  , "sort": [-----------searchRequest.source().sort("price",SortOrder.DESC);
    {
      "price": {
        "order": "desc"
      }
    }
  ]
}
# 地理坐标排序
GET /hotel/_search
{
  "query": {
    "match_all": {}
  }
  , 
  "sort": [
    {
      "_geo_distance": {
        "location": {
          "lat": 30,
          "lon": 120
        }, 
        "order": "asc",
        "unit": "km"
      }
    }
  ]
 -----------searchRequest.source().sort(
                     SortBuilders.geoDistanceSort("location",new GeoPoint(location))

                                                                                        //location  是地理坐标的字符串
                     .order(SortOrder.ASC).unit(DistanceUnit.KILOMETERS))
                                                      .sort("price", SortOrder.ASC);

                                                                (链式编程实现多字段排序)

2.9  查询结果高亮


# 查询字段与要参与高亮的字段不一致时
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "如家"
    }
  },
  "highlight": {-----------------searchRequest.source().highlighter(
                                                            new HighlightBuilder().field("name")
                                                            .requireFieldMatch(false));
    "fields": {
      "name": {
        "require_field_match": "false"
      }
    }
  }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值