es(全文检索)

1、客户端的使用

1.1、DSL查询和过滤

#查询关键字为vivo,国家为cn的,价格范围6000到8000 #价格降序,并且取前面2条:
	
GET shop/goods/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "vivo"
          }
        }
      ],
      "filter": [{
        "term": {
          "local": "cn"
        }
      },{
        "range":{
          "salary":{
            "gte":5000,
            "lte":8000
          }
        }
      }]
    }
  },
  "size": 2,
  "from": 0,
  "sort": [{"salary":"desc"}]
}

1.2、普通使用

# 删除所有
DELETE _all

# 查询所有
GET _search

#查询单个 _source:只查询自己的
GET empl/user/1/_source

# 添加 向empl这个数据库中文档id是1的user表里添加数据
PUT empl/user/3
{
  "id":2,
  "name":"zs",
  "age":18
}

# 修改 只修改局部_update
POST  empl/user/1/_update
{
  "doc": {
      "name":"ls"    
  }
}

# 删除
DELETE itsource/blog/AWtLdXGebyrzXGUwUnDH


#-----------------------

# 批量操作
POST _bulk
{ "delete": { "_index": "itsource", "_type": "employee", "_id": "123" }}
{ "create": { "_index": "itsource", "_type": "blog", "_id": "123" }}
{ "title": "我发布的博客" }
{ "index": { "_index": "itsource", "_type": "blog" }}
{ "title": "我的第二博客" }


# 1.批量获取 _mget
GET itsource/_mget
{
  "docs":[
      {
        "_index":"itsource",
        "_type":"blog",
        "_id":123
      },{
        "_index": "itsource",
        "_type": "blog",
        "_id": "AWtLdW9bbyrzXGUwUnDG",
        "_source":["title"]
      }
    
    ]
}
# 2.批量获取
GET itsource/blog/_mget
{
  "ids":["123","AWtLdW9bbyrzXGUwUnDG"]
}

# 分页
GET _search?size=5&from=0

# 字符串搜索
GET itsource/blog/_search?q=_id:123
	
#DSL模式查询
GET empl/user/_search
{
  "query": {
    "match": {
      "name": "ls"
    }    
  }
}
	
# DSL 查询公司员工年龄为19的,并按照加入年龄降序排列,最终返回只返回名字、年龄
	
GET empl/user/_search
{
  "query": {
    "match": {
      "age": "19"
    }
  },
  "size": 10,
  "from": 0, 
  "_source": ["name","age"],
  "sort":[{"age":"desc"}]
}
	
GET _search
DELETE _all
	
#dsl过滤
POST shop/goods/6
{
  "id":6,
  "name":"vivo",
  "salary":7000,
  "local":"cn"
}

POST shop/goods/5
{
  "id":5,
  "name":"huawel",
  "salary":15000,
  "local":"cn"
}

#分词器
POST _analyze
{
"analyzer":"ik_smart",
"text":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
}
	
#查看数据的映射
GET _mapping
	
PUT shop	
	
#设置mapping
POST shop/goods/_mapping
{
  "goods":{
    "properties":{
      "id":{"type":"long"},
      "name":{
        "type":"text",
        "analyzer": "ik_smart",
        "search_analyzer": "ik_smart"
      },
      "local":{
        "type":"text"
      },
      "salary":{"type":"double"}
    }
  }
}
	
	
#创建名为global_template的模板
PUT _template/global_template  
{
  "template":"*", 
  "settings":{"number_of_shards":1},
  "mappings":{
    "_default_":{
      "_all":{
        "enabled":false 
      },
      "dynamic_templates":[
        {
          "string_as_text":{
            "match_mapping_type":"string",
            "match":"*_text",
            "mapping":{
              "type":"text",
              "analyzer":"ik_max_word",
              "search_analyzer":"ik_max_word",
              "fields":{
                "raw":{
                  "type":"keyword",
                  "ignore_above":256
                }
              }
            }
          }
        },
        {
          "string_as_keyword":{
            "match_mapping_type":"string",
            "mapping":{
              "type":"keyword"
            }
          }
        }
      ]
    }
  }
}
	
PUT wps/employee/1
{
  "id":1,
  "username_text":"小三",
  "name":"唐三"
}
# 查看映射
GET wps/employee/_mapping

2、java里使用

import org.elasticsearch.action.bulk.BulkItemResponse;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequestBuilder;
import org.elasticsearch.action.get.GetRequestBuilder;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequestBuilder;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Test;

import java.net.InetAddress;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class ESTest {

    //普通的查询
    @Test
    public void testEsGet() throws Exception{
        //获取到es的客户端对象
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).
                addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));

        //获取到要进行查询的那条数据
        GetRequestBuilder getRequestBuilder = transportClient.prepareGet("wps","employee","1");

        //获取到查询的结果
        GetResponse getFields = getRequestBuilder.get();
        //获取到自己的真实数据
        System.out.println(getFields.getSource());

        transportClient.close();
    }

    //删除
    @Test
    public void testEsDelete() throws Exception{
        //获取到客户端
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).
                addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
        //删除
        DeleteRequestBuilder deleteRequestBuilder = transportClient.prepareDelete("wps", "employee", "1");
        //获取到删除的真实数据
        System.out.println(deleteRequestBuilder.get());

        transportClient.close();
    }

    //添加
    @Test
    public void testEsPost() throws Exception{
        //获取到客户端
        TransportClient transportClient = getTransportClient();
        //创建索引
        IndexRequestBuilder indexRequestBuilder = transportClient.prepareIndex("empl", "user", "1");

        //设置类容
        Map<String, Object> map = new HashMap<>();
        map.put("id",1 );
        map.put("name","zs" );
        map.put("age", 18);
        //添加内容
        indexRequestBuilder.setSource(map);

        //获取到自己添加的类容结果
        System.out.println(indexRequestBuilder.get());

        transportClient.close();

    }

    //修改
    @Test
    public void testEsUpdate() throws Exception{
        TransportClient transportClient = getTransportClient();

        //需要修改的数据
        UpdateRequestBuilder updateRequestBuilder = transportClient.prepareUpdate("empl", "user", "1");

        Map<String,Object> map = new HashMap<>();
        map.put("id",2 );
        map.put("name","ww" );
        map.put("age", 17);

        updateRequestBuilder.setDoc(map);

        //打印修改的信息
        System.out.println(updateRequestBuilder.get());

        transportClient.close();

    }

    //批量添加
    @Test
    public void testEsBatchSave() throws Exception{
        TransportClient transportClient = getTransportClient();

        //批量请求的对象
        BulkRequestBuilder bulkRequestBuilder = transportClient.prepareBulk();

        for (int i = 0;i<10;i++){
            Map<String,Object> map = new HashMap<>();
            map.put("id",i+1 );
            map.put("name", "小"+i);
            map.put("des","渡劫飞升" );

            //索引
            IndexRequestBuilder indexRequestBuilder = transportClient.prepareIndex("dept", "user",Integer.valueOf(i+1).toString());
            //添加数据
            indexRequestBuilder.setSource(map);
            //保存
            bulkRequestBuilder.add(indexRequestBuilder);
        }

        //获取到批量添加的结果
        BulkResponse bulkItemResponses = bulkRequestBuilder.get();

        //迭代出结果
        Iterator<BulkItemResponse> iterator = bulkItemResponses.iterator();
        //是否有下一个
        while (iterator.hasNext()){
            //如果有就打印出来
            BulkItemResponse next = iterator.next();
            System.out.println(next.getResponse());
        }

        transportClient.close();

    }

    //搜索
    @Test
    public void testEsQuery() throws Exception{
        //客户端
        TransportClient transportClient = getTransportClient();

        //获取组合查询构造器
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

        //查询
        List<QueryBuilder> musts = boolQueryBuilder.must();
        musts.add(QueryBuilders.termQuery("des","渡劫飞升" ));

        //过滤
        List<QueryBuilder> filter = boolQueryBuilder.filter();
        filter.add(QueryBuilders.rangeQuery("id").gte(1).lt(10));

        //设置分页 排序
        SearchResponse searchResponse = transportClient.prepareSearch("dept")
                .setQuery(boolQueryBuilder)
                .setFrom(0)
                .setSize(10)
                .addSort("id", SortOrder.DESC)
                .get();
        //总条数
        long totalHits = searchResponse.getHits().getTotalHits();
        System.out.println(totalHits);

        // 循环数据结构
        SearchHit[] hits = searchResponse.getHits().getHits();
        for(SearchHit hit : hits){
            System.out.println(hit.getSource());
        }

        transportClient.close();
    }

    //抽取es的客户端
    private TransportClient getTransportClient() throws Exception {

        //主机
        TransportAddress transportAddress = new InetSocketTransportAddress(InetAddress.getByName("localhost"),9300);

        //获取到客户端对象
        return new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(transportAddress);
    }

}
发布了20 篇原创文章 · 获赞 4 · 访问量 2111

猜你喜欢

转载自blog.csdn.net/weixin_45028726/article/details/91869836