1、脚本控制es

  • es的crud
# 创建索引
PUT /test01

# 查询索引 结构
GET /test01

# 删除索引
DELETE /test01

# 创建类型
PUT /test1
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text"
      },
      "content":{
        "type": "text"
      },
      "price":{
        "type": "double"
      }
    }
  }
}

# 插入数据
POST /test1/_doc/2
{
  "name":"奥里给",
  "content":"6786899",
  "price":66.6
}

# 如果id相同 则是修改操作
POST /test1/_doc/1
{
  "name":"小李",
  "content":"45555",
  "price":22.6
}

# 查询索引 数据
GET /test1/_search

# 删除id为2的数据
DELETE /test1/_doc/2

1.1、查询所有

GET /test1/_search
{
  "query": {
    "match_all": {}
  }
}

1.2、模糊查询

GET /test1/_search
{
  "query": {
    "match": {
      "name": "小"
    }
  }
}

1.3、精确查询

GET /test1/_search
{
  "query": {
    "term": {
      "price": "66.6"
    }
  }
}

1.4、区间查询

GET /test1/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 44,
        "lte": 70
      }
    }
  }
}

1.5、多条件组合查询

  • 查询name中包含“小”的和44<=price<=70的
GET /test1/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "小"
          }
        },
        {
          "range": {
            "price": {
              "gte": 44,
              "lte": 70
            }
          }
        }
      ]
    }
  }
}

1.6、分页查询

  • from:起始位置,size:分页单位,sort:排序
GET /test1/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "小"
          }
        },
        {
          "range": {
            "price": {
              "gte": 20,
              "lte": 70
            }
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 3,
  "sort": [
    {
      "price": {
        "order": "desc"
      }
    }
  ]
}

1.7、高亮查询

GET /test1/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "小"
          }
        },
        {
          "range": {
            "price": {
              "gte": 44,
              "lte": 70
            }
          }
        }
      ]
    }
  },
  "highlight": {
    "fields": {
      "name": {
        "pre_tags": "<font color='red'>",
        "post_tags": "</font>"
      }
    }
  }
}

1.8、使用分词器查询

  • 验证分词器(对中文不太友好,得指定分词器)
  • 倒排索引 根据id找内容
  • 正排索引 根据关键词内容找id
  • 最小分词
POST /_analyze
{
  "analyzer": "ik_smart", 
  "text":"饼干好吃"
}
  • 最大分词
POST /_analyze
{
  "analyzer": "ik_max_word", 
  "text":"饼干好吃"
}

2、java控制es

2.1、全量同步到es(原生写法)

  • 使用集成spring boot的 elasticsearchRestTemplate 方法
List<Emp> list = empService.list();

// 创建索引     将数据库中的数据全量同步到es
ArrayList<IndexQuery> indexQueries = new ArrayList<>();
for (Emp emp : list) {
    IndexQuery indexQuery = new IndexQueryBuilder()
          .withId(emp.getId()+"")
          .withObject(emp)
          .build();
    indexQueries.add(indexQuery);
}
elasticsearchRestTemplate.bulkIndex(indexQueries, Emp.class);

2.2、全量同步到es(简易写法)

  • 使用es官方提供的 CrudRepository 方法
  • 自定义一个接口,继承这个方法
package com.llh.repository;

import com.llh.domain.Emp;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

/**
 * User: lilinhan
 * DateTime: 2023/9/19 20:09
 */
@Repository
public interface EmpRepository extends CrudRepository<Emp,Integer> {

}
  • 测试类使用
//  同步(全量同步+增量同步)
@Autowired
EmpRepository empRepository;

List<Emp> list = empService.list();
empRepository.saveAll(list);

2.3、查询所有

NativeSearchQuery query = new NativeSearchQueryBuilder().build();
SearchHits<Emp> search = elasticsearchRestTemplate.search(query, Emp.class);
// 总条数
long totalHits = search.getTotalHits();

// 数据展示
System.out.println("总条数:"+totalHits);

List<Emp> list = new ArrayList<>();
List<SearchHit<Emp>> searchHits = search.getSearchHits();
for (SearchHit<Emp> searchHit : searchHits) {
    Emp emp = searchHit.getContent();
    list.add(emp);
}
for (Emp emp : list) {
    System.out.println(emp);
}

2.4、模糊查询

  • 查询姓名中包含“子”的数据
String name = "子";
MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("ename", name);
NativeSearchQuery query = new NativeSearchQueryBuilder()
      .withQuery(queryBuilder)
      .build();
SearchHits<Emp> search = elasticsearchRestTemplate.search(query, Emp.class);

2.5、精确查询

  • 查询 id=5 的数据
TermQueryBuilder queryBuilder = QueryBuilders.termQuery("id", 5);
NativeSearchQuery query = new NativeSearchQueryBuilder()
      .withQuery(queryBuilder)
SearchHits<Emp> search = elasticsearchRestTemplate.search(query, Emp.class);

2.6、多条件组合查询(区间+模糊)

  • 查询 id=5 并且 name 中包含“子”的数据
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 区间
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("id");
rangeQuery.gt(2);
rangeQuery.lt(10);
// 模糊
String name = "子";
MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("ename", name);
// must==and      should==or
boolQuery.must(rangeQuery);
boolQuery.must(matchQuery);
NativeSearchQuery query = new NativeSearchQueryBuilder()
      .withQuery(boolQuery)
      .build();
SearchHits<Emp> search = elasticsearchRestTemplate.search(query, Emp.class);

2.7、分页查询

  • 根据id正序排序,展示第1页,每页显示5条数据
String gender = "0";
QueryBuilders.regexpQuery("gender",gender);
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
Pageable pageable = PageRequest.of(0,5, Sort.Direction.ASC,"id");

NativeSearchQuery query = new NativeSearchQueryBuilder()
      .withQuery(boolQueryBuilder)
      .withPageable(pageable)
      .build();

SearchHits<Emp> search = elasticsearchRestTemplate.search(query, Emp.class);
标签:no tag
本文到此就结束啦
Last modification:March 25, 2024
如果觉得我的文章对你有用,请随意赞赏