ElasticSearch总结

Elasticsearch是一个基于Lucene的搜索服务器。是一个分布式、可扩展、实时的搜索与数据分析引擎。 它能从项目一开始就赋予你的数据以搜索、分析和探索的能力,可用于实现全文搜索和实时数据统计。
简称ES。

一、安装和使用

1、可进入官网下载zip的包:https://www.elastic.co/cn/
2、安装中文分词插件,在elasticsearch-版本号\bin目录下执行以下命令:elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/版本号/elasticsearch-analysis-ik-版本号.zip
ps:安装ik分词器必须对应es版本。
3、运行bin目录下的elasticsearch.bat启动ES。
4、下载Kibana,作为访问Elasticsearch的客户端,下载zip包,并解压到指定目录,下载地址:https://artifacts.elastic.co/downloads/kibana/kibana-你的es版本号-windows-x86_64.zip
5、运行bin目录下的kibana.bat
6、访问http://localhost:5601 即可打开Kibana的用户界面

二、springboot整合Elasticsearch

添加es相关pom

<!--Elasticsearch-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch<artifactId>
</dependency>

在spring节点下添加es配置。

 data:
    elasticsearch:
      repositories:
        enabled: true
      cluster-nodes: 127.0.0.1:9300 # 地址及端口号
      cluster-name: elasticsearch 	# 集群名称

保存到es里的字段信息

/**
 * @date 2021-05-27 13:34
 * @Document 作用在类,标记实体类为文档对象,一般有两个属性
 * indexName:对应索引库名称
 * type:对应在索引库中的类型
 * shards:分片数量,默认5
 * replicas:副本数量,默认1
 * @Id 作用在成员变量,标记一个字段作为id主键
 * @Field 作用在成员变量,标记为文档的字段,并指定字段映射属性:
 * type:字段类型,取值是枚举:FieldType
 * index:是否索引,布尔类型,默认是true
 * store:是否存储,布尔类型,默认是false
 * analyzer:分词器名称
 */
@Document(indexName = "user", type = "issue")
@Data
public class EsUser implements Serializable {
    @Id
    @Field(type = FieldType.Long,store = true)
    private Long id;

    /**
     * 用户名
     */
    @Field(type = FieldType.Text,store = true,analyzer = "ik_max_word")
    private String userName;

    /**
     * 密码
     */
    @Field(type = FieldType.Text,store = true,index = false)
    private String password;

    /**
     * 加密盐值
     */
    @Field(type = FieldType.Text,store = true,index = false)
    private String salt;

    /**
     * 邮箱
     */
    @Field(type = FieldType.Text,store = true)
    private String email;

    /**
     * 联系方式
     */
    @Field(type = FieldType.Text,store = true)
    private String phone;

    /**
     * 年龄:1男2女
     */
    @Field(type = FieldType.Integer,store = true,index = false)
    private Integer sex;

    /**
     * 年龄
     */
    @Field(type = FieldType.Integer,store = true,index = false)
    private Integer age;

    /**
     * 最后登录时间
     */
    @Field(type = FieldType.Date,store = true,index = false)
    private Date lastLoginTime;
    /**
     * 创建时间
     */
    @Field(type = FieldType.Date,store = true,index = false)
    private Date createdAt;

    /**
     * 是否删除:0=正常,1=删除
     */
    @Field(type = FieldType.Boolean,store = true)
    private Boolean archive;

}

新建一个接口,继承ElasticsearchRepository

public interface EsUserRepository extends ElasticsearchRepository<EsUser,Long> {
}

我这边是直接查询数据库,添加一些数据到es中

    @Autowired
    private EsUserRepository esUserRepository;
    @Autowired
    UserService userService;
    @Override
    public R userSaveAll() {
        //查询数据
        List<User> users = userService.selectByExample(Example.builder(User.class).andWhere(Sqls.custom()).build());
        List<EsUser> esUsers = new ArrayList<>();
        if (users!=null && users.size()>0){
            for (User user : users){
                EsUser esUser = new EsUser();
                BeanUtils.copyProperties(user,esUser);
                esUsers.add(esUser);
            }
        }
        //插入所有
        Iterable<EsUser> esUsersList = esUserRepository.saveAll(esUsers);
        int result = 0;
        //成功数量
        Iterator<EsUser> iterator = esUsersList.iterator();
        while (iterator.hasNext()){
            result++;
            iterator.next();
        }
        return R.success(result);
    }

使用kibana查询一下全部是否都保存进来了
在这里插入图片描述
可以看到数据库里的数据都保存到es中了
在这里插入图片描述
这里再分享一个多条件查询的Java代码

    public R findUserList(String name,String phone, Integer pageNum, Integer pageSize) {
        //分页信息
        Pageable pageable = PageRequest.of(pageNum, pageSize);
        //创建查询条件生成器
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        //分页
        nativeSearchQueryBuilder.withPageable(pageable);
        //匹配查询
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        //过滤
        if (StringUtils.isNotEmpty(name)){
            //根据名称查询
            MatchQueryBuilder userName = QueryBuilders.matchQuery("userName", name);
            boolQueryBuilder.must(userName);

        }
        if (StringUtils.isNotEmpty(phone)){
            //根据手机号查询
            MatchQueryBuilder userName = QueryBuilders.matchQuery("phone", phone);
            boolQueryBuilder.must(userName);
        }
        //过滤是否删除的用户
        boolQueryBuilder.filter(QueryBuilders.matchPhraseQuery("archive", false));
        nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
        //排序
        nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("createdAt").order(SortOrder.DESC));
        //es查询
        Page<EsUser> page = esUserRepository.search(nativeSearchQueryBuilder.build());
        PageModel pageModel = new PageModel();
        pageModel.setPage(pageNum);
        pageModel.setSize(pageSize);
        pageModel.setPageList(page.getContent());
        pageModel.setTotal(Long.valueOf(page.getTotalElements()));
        return R.success(pageModel);
    }
三、常用的DSL命令

1、查询全部

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

2、条件查询
match:match查询的时候,elasticsearch会根据你给定的字段提供合适的分析器,将查询语句分词之后去匹配含有分词之后词语的。
term:不进行分词,直接完全匹配查询。
需要注意的是:如果你搜索的字段是keyword类型,那么无论match和term都是一样的,都不进行分词。
match_all的是一个空查询,就是查询索引类型下的所有文档。可以查询出所有文档之后在进行过滤等。

GET user/issue/_search
{
  "query": {
    "match": {
      "userName":"张三"
    }
  }
}

3、多条件查询
bool可以用来实现多条件查询,bool包含的属性如下:
must:表示必须匹配的属性,匹配这些条件才能被包含进来
must_not:表示不能匹配这些条件才能被包含进来。
should :如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。
filter :必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。
需要特别注意的是: match不支持多条件查询,会提示 [match] query doesn’t support multiple fields, found [author] and [wordCount]"。

//查询用户带李的用户,排除id不为1的数据
GET user/issue/_search
{
  "query": {
    "bool": {
      "must": [{
        "match": {
          "userName": "李"
        }
      }
      ], 
      "must_not": [{
          "match": {
            "id": "1"
          }
        }
      ]
    }
  }
 
}

4、分页排序
from:表示分页开始的条数(也是从0开始),size表示你要查询的数量。
sort:排序的字段,根据哪个字段进行如何排序。

//查询全部分页根据id排序
GET _search
{
  "query": {
    "match_all": {}
  },
  "from": 0,
  "size": 10,
  "sort": [
    {
      "id": {
        "order": "asc"
      }
    }
  ]
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值