Elasticsearch操作笔记
排序相关:
GET people/_search
{
"query":{
"match":{
"name":"zhangsan"
}
},
"sort":[
{
"price":{
"order":"desc"
}
}
]
}
在查询后,加一个集合,sort,即可指定排序规则,即排序的属性,顺序或者倒叙
java代码相关实现查询排序:
sourceBuilder.sort("price", SortOrder.ASC).sort("a",SortOrder.ASC);
//链式编程,可以加排序规则
文档操作
//根据id查询文档
GetRequest getRequest = new GetRequest("people","id");
GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT);
String sourceAsString = documentFields.getSourceAsString();
//新增或者修改文档
Object o = new Object();
String s = JSON.toJSONString(o);
IndexRequest indexRequest= new IndexRequest("索引名称").id("asd").source(s, XContentType.JSON);
IndexResponse index = client.index(indexRequest, RequestOptions.DEFAULT);
//删除文档
DeleteRequest deleteRequest= new DeleteRequest("索引名称","id");
DeleteResponse delete = client.delete(deleteRequest, RequestOptions.DEFAULT);
matchAll查询:
查询所有文档
-
http://192.168.23.129:9200/people/_doc /索引名/_doc 默认查询所有
-
JAVA API操作:
//构造查询请求对象,构造方法参数为索引名称 SearchRequest searchRequest = new SearchRequest("people"); //查询条件构造器 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //指定查询条件 QueryBuilder query = QueryBuilders.matchAllQuery(); sourceBuilder.query(query); searchRequest.source(sourceBuilder); SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT); SearchHits hits = search.getHits(); TotalHits totalHits = hits.getTotalHits(); long value = totalHits.value; System.out.println(value); SearchHit[] hits1 = hits.getHits(); for (SearchHit s :hits1){ String sourceAsString = s.getSourceAsString(); System.out.println(sourceAsString); }
总结:其实有一个嵌套过程。由client发起请求,需要传入searchrequest,searchrequest中需要传入sourceBuilder,这个builder可以用query方法指定各种查询方法,然后指定各种参数。sourcebuilder中还可以添加分页信息
term查询:
词条查询,不会对查询条件进行分词
match查询:
分值后的等值匹配
脚本操作-1:
GET people/_search
{
"query":{
"match":{
"name":"zhangsan"
}
}
}
脚本操作-2
GET people/_search
{
"query":{
"match":{
"name":{
"query":"lisi",
"operator":"and" --这里默认为 or,即分词后与不分词取并集,and意思是取交集
}
}
}
}
JAVA-API操作:
@Test
public void matchQuery() throws IOException {
//构造查询请求对象,构造方法参数为索引名称
SearchRequest searchRequest = new SearchRequest("people");
//查询条件构造器
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//指定查询条件
MatchQueryBuilder query = QueryBuilders.matchQuery("key", "val");
query.operator(Operator.OR);//指定交集或者并集
sourceBuilder.query(query);
searchRequest.source(sourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
TotalHits totalHits = hits.getTotalHits();
long value = totalHits.value;
System.out.println(value);
SearchHit[] hits1 = hits.getHits();
for (SearchHit s :hits1){
String sourceAsString = s.getSourceAsString();
System.out.println(sourceAsString);
}
}
模糊查询-wildcard查询:
对查询条件分词后,进行模糊匹配
脚本操作:
GET people/_search
{
"query":{
"wildcard":{
"name":{
"value":"李*" ---以李开头,?0或1,*,多个
}
}
}
}
JAVA -API操作:
//构造查询请求对象,构造方法参数为索引名称
SearchRequest searchRequest = new SearchRequest("people");
//查询条件构造器
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//指定查询条件
WildcardQueryBuilder query = QueryBuilders.wildcardQuery("name", "李*");
sourceBuilder.query(query);
searchRequest.source(sourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
TotalHits totalHits = hits.getTotalHits();
long value = totalHits.value;
System.out.println(value);
SearchHit[] hits1 = hits.getHits();
for (SearchHit s :hits1){
String sourceAsString = s.getSourceAsString();
System.out.println(sourceAsString);
}
模糊查询-正则查询
正则查询
脚本操作:
GET people/_search
{
"query":{
"regexp":{
"name":"\\w+(.)*" --搜索正则即可
}
}
}
JAVA-API操作:
//构造查询请求对象,构造方法参数为索引名称
SearchRequest searchRequest = new SearchRequest("people");
//查询条件构造器
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//指定查询条件
RegexpQueryBuilder query = QueryBuilders.regexpQuery("name", "李*");
sourceBuilder.query(query);
searchRequest.source(sourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
TotalHits totalHits = hits.getTotalHits();
long value = totalHits.value;
System.out.println(value);
SearchHit[] hits1 = hits.getHits();
for (SearchHit s :hits1){
String sourceAsString = s.getSourceAsString();
System.out.println(sourceAsString);
}
模糊查询-前缀查询:
前缀查询
脚本操作:
GET people/_search
{
"query":{
"prefix":{
"name":{
"value":"李四" --查询以李四开头的,貌似会把空格后的数据算上
}
}
}
}
JAVA-API操作:
//构造查询请求对象,构造方法参数为索引名称
SearchRequest searchRequest = new SearchRequest("people");
//查询条件构造器
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//指定查询条件
PrefixQueryBuilder query = QueryBuilders.prefixQuery("name", "李");
sourceBuilder.query(query);
searchRequest.source(sourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
TotalHits totalHits = hits.getTotalHits();
long value = totalHits.value;
System.out.println(value);
SearchHit[] hits1 = hits.getHits();
for (SearchHit s :hits1){
String sourceAsString = s.getSourceAsString();
System.out.println(sourceAsString);
}
范围查询:
范围查询
脚本操作:
GET people/_search
{
"query":{
"range":{
"name":{
"gte":2000, --最小值
"lte":3000 --最大值
}
}
}
}
JAVA-API操作:
@Test
public void rangeSearch() throws IOException {
//构造查询请求对象,构造方法参数为索引名称
SearchRequest searchRequest = new SearchRequest("people");
//查询条件构造器
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//指定查询条件,指定查询词缀
RangeQueryBuilder query = QueryBuilders.rangeQuery("price");
query.gte(2000);//下限
query.lte(3000);//上线
sourceBuilder.query(query);
searchRequest.source(sourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
TotalHits totalHits = hits.getTotalHits();
long value = totalHits.value;
System.out.println(value);
SearchHit[] hits1 = hits.getHits();
for (SearchHit s :hits1){
String sourceAsString = s.getSourceAsString();
System.out.println(sourceAsString);
}
}
queryString查询
描述:
可以指定多个字段进行查询一个特定值.例如查询:李,可以从指定从name中查,还可以同时指定在addr中查询
脚本操作:
#GET people/_search
{
"query":{
"query_string":{
"fields":["name","addr","age"],
"query":"李 AND 四" #OR,自定义分词,AND,强制合并不分词
}
}
}
# 第二种操作方式
{
"query":{
"simple_query_string":{
"fields":["name","addr","age"],
"query":"李 AND 四" #自定义的OR和AND不起作用,视为一个普通词
}
}
}
java-api 操作
//构造查询请求对象,构造方法参数为索引名称
SearchRequest searchRequest = new SearchRequest("people");
//查询条件构造器
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//指定查询条件,指定查询词缀
QueryStringQueryBuilder query = QueryBuilders.queryStringQuery("李").field("name").field("addr").defaultOperator(Operator.AND);
sourceBuilder.query(query);
sourceBuilder.sort("price", SortOrder.ASC).sort("a",SortOrder.ASC);
searchRequest.source(sourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
TotalHits totalHits = hits.getTotalHits();
long value = totalHits.value;
System.out.println(value);
SearchHit[] hits1 = hits.getHits();
for (SearchHit s :hits1){
String sourceAsString = s.getSourceAsString();
System.out.println(sourceAsString);
}
布尔查询
描述:
可以对多个查询进行连接查询
查询分类:
- must查询:条件必须成立(and)
- must_not:条件必须不成立(not)
- should:条件可以成立
- filter:条件必须成立,比must性能好,去掉了得分
脚本操作:
#GET people/_search
{
"query":{
"bool":{
"must":[{}],
"filter":[{}],
"must_not":[{}],
"should":[{}]
}
}
}
#示例:
{
"query":{
"bool":{
"must":[{
"term":{
"brand":{
"value":"华为"
}
}
}],
"filter":[{
"range":{
"name":{
"gte":2000, --最小值
"lte":3000 --最大值
}
}
}],
"must_not":[{}],
"should":[{}]
}
}
}
JAVA-API操作:
@Test
public void boolQuery() throws IOException {
//构造查询请求对象,构造方法参数为索引名称
SearchRequest searchRequest = new SearchRequest("people");
//查询条件构造器
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//指定查询条件,指定查询词缀
BoolQueryBuilder query = QueryBuilders.boolQuery();
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("a", "b");
query.must(termQueryBuilder);
RangeQueryBuilder price = QueryBuilders.rangeQuery("price");
price.gte(2000);
price.lte(3000);
query.should(price);
sourceBuilder.query(query);
sourceBuilder.sort("price", SortOrder.ASC).sort("a",SortOrder.ASC);
searchRequest.source(sourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
TotalHits totalHits = hits.getTotalHits();
long value = totalHits.value;
System.out.println(value);
SearchHit[] hits1 = hits.getHits();
for (SearchHit s :hits1){
String sourceAsString = s.getSourceAsString();
System.out.println(sourceAsString);
}
}
解释:其实就是构造一个boolquery对象,将别的查询对象放进取即可
聚合查询:
描述:
- 指标聚合:mysql中的聚合函数,max,min,avg,sum等
- 桶聚合:相当于mysql中的group by聚合,不能对text类型进行分组,会失败
脚本操作:
#GET people/_search
#指标聚合:
{
"query":{
"match":{
"name":"张三"
}
},
"aggs":{
"NAME":{ #此处的NAME是聚合查询后,将聚合结果封装的key,可以自定义
"max":{
"field":"price"
}
}
}
}
#桶聚合
{
"query":{
"match":{
"name":"张三"
}
},
"aggs":{
"NAME":{ #此处的NAME是聚合查询后,将聚合结果封装的key,可以自定义
"terms":{ #terms表示分组操作
"field":"price",
"size":200
}
}
}
}