elasticsearch的模糊查询

使用elasticsearch首先创建索引
命令行创建的方法:

curl -XPUT 127.0.0.1:9200/ikblockchain?pretty -d  '{"mappings":{"server_log":{"properties":{"addTime":{"type":"date","format":"yyyy-MM-dd HH:mm:ss"},"appName":{"type":"text"},"blockHeight":{"type":"long"},"cropId":{"type":"text"},"filePath":{"type":"text","analyzer":"whitespace"},"message":{"type":"keyword"},"rawContent":{"type":"text","analyzer":"whitespace"},"rawJsonContent":{"type":"text"},"timestamp":{"type":"long"},"toolType":{"type":"text"},"transactionId":{"type":"long"}}}}}' -H "Content-Type: application/json"

这个命令注意:后边 -H “Content-Type: application/json” 很重要,不然会报错
通过postman创建
在这里插入图片描述
图中server_log是封装对象的表名
在这里插入图片描述

package com.dbapp.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.io.Serializable;
import java.util.Date;

/**
 * es
 */
@Document(indexName = "自定义的索引名称", type = "server_log", shards = 1, replicas = 0, refreshInterval = "-1")
public class ServerLog implements Serializable {

    private static final long serialVersionUID = -3526322457890471922L;
    @Id
    private String id;

	/**
	* 这里的type 可以使text和keyword,区别是在查询是text自动分词,keyword不分词
	*/
    @Field(type = FieldType.Keyword)
    private String message;

    /**
     * 注意带上timezone="GMT+8",否则es搜索时间区间时会因为时区问题跟预期不一样,es默认utc,需要转成GMT
     */
    @Field(type = FieldType.Date, format = DateFormat.custom , pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    private Date addTime;
    private Long timestamp;
    private Integer blockHeight;
    private Integer transactionId;
    @Field(type = FieldType.Text)
    private String cropId;


    public String getCropId() {
        return cropId;
    }

    public void setCropId(String cropId) {
        this.cropId = cropId;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Date getAddTime() {
        return addTime;
    }

    public void setAddTime(Date addTime) {
        this.addTime = addTime;
    }

    public Integer getBlockHeight() {
        return blockHeight;
    }

    public void setBlockHeight(Integer blockHeight) {
        this.blockHeight = blockHeight;
    }

    public Integer getTransactionId() {
        return transactionId;
    }

    public void setTransactionId(Integer transactionId) {
        this.transactionId = transactionId;
    }

    public Long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Long timestamp) {
        this.timestamp = timestamp;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

条件查询

 @Override
    public Page<ServerLog> getLogPageList(Map param, Integer pageNumber, Integer pageSize) {
        if(param == null){
            param = new HashMap();
        }
        Pageable pageable = PageRequest.of(pageNumber, pageSize);
        Page<ServerLog> logPage;
        QueryBuilder queryBuilder = QueryBuilders.boolQuery();
        Date begin = (Date) param.get("begin");
        Date end = (Date) param.get("end");
        if (begin !=null){
            ((BoolQueryBuilder) queryBuilder).must(QueryBuilders.rangeQuery("addTime").gte(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(begin)));
        }
        if (end !=null){
            ((BoolQueryBuilder) queryBuilder).must(QueryBuilders.rangeQuery("addTime").lte(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(end)));
        }
        if(!StringUtils.isBlank((String)param.get("cropId"))){
            ((BoolQueryBuilder) queryBuilder).must(QueryBuilders.matchQuery("cropId",param.get("cropId")));
        }
        if(!StringUtils.isBlank((String)param.get("keyword"))){
            mutilQuery((BoolQueryBuilder)queryBuilder,(String)param.get("keyword"));
        }
        SortBuilder sortBuilder= SortBuilders.fieldSort("addTime").order(SortOrder.DESC);
        NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
        builder.withQuery(queryBuilder);
        builder.withPageable(pageable);
        builder.withSort(sortBuilder);
        SearchQuery searchQuery = builder.build();
        logPage = serverLogRepository.search(searchQuery);
        return logPage;
    }

@Override
    public Iterable<ServerLog> getLogList(Map param) {
        if(param == null){
            param = new HashMap();
        }
        QueryBuilder queryBuilder = QueryBuilders.boolQuery();
        Date begin = (Date) param.get("begin");
        Date end = (Date) param.get("end");
        if (begin !=null){
            ((BoolQueryBuilder) queryBuilder).must(QueryBuilders.rangeQuery("addTime").gte(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(begin)));
        }
        if (end !=null){
            ((BoolQueryBuilder) queryBuilder).must(QueryBuilders.rangeQuery("addTime").lte(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(end)));
        }
        if(!StringUtils.isBlank((String)param.get("cropId"))){
            ((BoolQueryBuilder) queryBuilder).must(QueryBuilders.matchQuery("cropId",param.get("cropId")));
        }
        if(!StringUtils.isBlank((String)param.get("keyword"))){
            mutilQuery((BoolQueryBuilder)queryBuilder,(String)param.get("keyword"));
        }
        return serverLogRepository.search(queryBuilder);
    }
private void mutilQuery(BoolQueryBuilder queryBuilder,String content){
        QueryBuilder keyQueryBuilder = QueryBuilders.boolQuery();
        String keyword="*"+content.toLowerCase()+"*";
        ((BoolQueryBuilder) keyQueryBuilder).should(QueryBuilders.wildcardQuery("cropId",keyword));
        ((BoolQueryBuilder) keyQueryBuilder).should(QueryBuilders.wildcardQuery("message",keyword));
        //在使用wildcard模糊查询的时候如果不想对字段内容进行分词查询的话可以将内容变成keyword模式去查询,这样我们进行查询的时候就不会进行分词查询了
        //((BoolQueryBuilder) keyQueryBuilder).should(QueryBuilders.wildcardQuery("message.keyword",keyword))
        if(StringUtils.isNumeric(content)){
            ((BoolQueryBuilder) keyQueryBuilder).should(QueryBuilders.termQuery("blockHeight",content));
            ((BoolQueryBuilder) keyQueryBuilder).should(QueryBuilders.termQuery("transactionId",content));
        }
        (queryBuilder).must(keyQueryBuilder);
    }
package com.dbapp.repository;

import com.dbapp.entity.ServerLog;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

/**
 */
 @Repository
public interface ServerLogRepository extends ElasticsearchRepository<ServerLog, String> {



    /**
     * 根据CropId查询
     *
     * @param cropId
     * @param pageable
     * @return
     */
    abstract Page<ServerLog> findByCropId(String cropId, Pageable pageable);

    /**
     * 查询指定CropId下的总数
     *
     * @param cropId
     * @return
     */
    abstract long countByCropId(String cropId);

    void  deleteByTimestampLessThanEqual(long time);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,Elasticsearch 中的模糊查询可以通过使用模糊查询(Fuzzy Query)和通配符询(Wildcard Query)来实现。 1. 模糊查询(Fuzzy Query):模糊查询是指在搜索时根据询条件中的一个词来匹配文档中的一个或多个词,而不是完全匹配该询条件。模糊查询可以通过使用 “fuzzy” 询来实现,例如: ``` GET /my_index/_search { "query": { "fuzzy": { "title": { "value": "quick" } } } } ``` 在上面的询中,会匹配包含 “quick” 以及类似于 “quack”、“quicker”、“quickest” 等单词的文档。 2. 通配符询(Wildcard Query):通配符询是指在搜索时使用通配符来匹配文档中的一个或多个词。通配符询可以通过使用 “wildcard” 询来实现,例如: ``` GET /my_index/_search { "query": { "wildcard": { "title": { "value": "qu*" } } } } ``` 在上面的询中,会匹配包含以 “qu” 开头的单词的文档,如 “quick”、“quality”、“question” 等。 需要注意的是,使用模糊查询和通配符询会影响搜索性能,因此在使用时需要谨慎。同时,Elasticsearch 中还有其他类型的询,可以根据具体情况选择使用。 ### 回答2: ElasticSearch是一个开源的搜索引擎,拥有强大的全文搜索和分析能力。在ElasticSearch中,模糊查询是一种常见的询类型,用于找到与指定的搜索词或短语相似或相关的文档。 在ElasticSearch中,模糊查询可以通过使用通配符、模糊匹配、近似匹配和相似度匹配等方式实现。通配符询可以使用通配符符号(*或?)匹配多个字符或单个字符。模糊匹配则使用模糊符号(~)指示询应该接受的编辑距离,从而找到与搜索词相似但不完全匹配的文档。 另外,近似匹配允许搜索在单词之间添加或删除字符,以便更好地匹配询词。相似度匹配则是利用TF-IDF算法计算词项的相对权重,从而找到与搜索词相似度最高的文档。 为了进行模糊查询,需要使用ElasticSearch提供的询DSL语句。在询语句中,可以使用模糊查询子句(fuzzy)指定需要进行模糊查询的字段和搜索词,以及匹配的模糊程度等参数。 不过需要注意的是,模糊查询可能会导致询时间延长和性能下降,特别是在大数据集下。因此,在使用模糊查询时,需要权衡询的结果精确性和询性能之间的平衡。 总而言之,ElasticSearch模糊查询提供了灵活的搜索功能,可以帮助用户找到与搜索词相似或相关的文档。但在使用模糊查询时,需要根据具体情况选择合适的询方式,并注意询性能的优化。 ### 回答3: Elasticsearch是一个开源的搜索引擎,它提供了丰富的询功能,包括模糊查询模糊查询是一种在搜索过程中允许存在一定的匹配误差的询方式。 在Elasticsearch中,我们可以使用模糊查询来处理那些可能存在拼写错误或者其他差异的搜索请求。使用模糊查询可以找到与搜索关键词相似的文档,即使这些文档可能与搜索关键词不完全匹配。 Elasticsearch提供了多种方式来实现模糊查询。其中一种方式是使用模糊匹配询(fuzzy match query)。通过指定一个最大编辑距离(max_edit_distance),我们可以控制模糊查询的容忍度。编辑距离指的是将一个词语转换成另一个词语所需要的最少操作次数(插入、删除、替换)。 另一种实现模糊查询的方式是使用通配符询(wildcard query)。通配符询支持在搜索关键词中使用通配符符号(*或?),表示匹配任意字符(*)或者匹配单个字符(?)。 另外,通过使用编辑距离相似度(edit distance similarity)计算,Elasticsearch还可以为搜索结果打分。这意味着匹配度较高的文档将排在搜索结果列表的前面。 综上所述,Elasticsearch模糊查询功能可以帮助我们处理那些可能存在一定误差的搜索请求,提高搜索的准确性和召回率。通过合理选择最大编辑距离、使用通配符和应用编辑距离相似度计算,我们可以灵活地控制模糊查询的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值