Elasticsearch工具

elasticsearch工具

import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.MultiSearchRequest;
import org.elasticsearch.action.search.MultiSearchResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.get.GetResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Map;

@Slf4j
@Component
public class ElasticsearchUtil {

    @Autowired
    private RestHighLevelClient esClient;

    /**
     * 创建索引时,分配的主分片的数量
     */
    private static final String INDEX_NUM_OF_SHARDS = "index.number_of_shards";

    /**
     * 创建索引时,为每一个主分片分配的副本分片的数量
     */
    private static final String INDEX_NUM_OF_REPLICAS = "index.number_of_replicas";

    /**
     * 索引是否存在
     *
     * @param indexName 索引名称
     * @return
     * @throws IOException
     */
    public boolean existIndex(String indexName) throws IOException {
        GetIndexRequest request = new GetIndexRequest(indexName);
        return esClient.indices().exists(request, RequestOptions.DEFAULT);
    }

    /**
     * 新增文档-json方式 同步
     *
     * @param indexName 索引名称
     * @param id        文档id
     * @throws IOException
     */
    public IndexResponse addDocumentJSON(String indexName, String id, String json) throws IOException {
        IndexRequest request = new IndexRequest(indexName).id(id).source(json, XContentType.JSON);
        return esClient.index(request, RequestOptions.DEFAULT);
    }

    /**
     * 新增文档-json方式 异步
     *
     * @param indexName 索引名称
     * @param id        文档id
     * @throws IOException
     */
    public void addDocumentJSONAsync(String indexName, String id, String json) {
        IndexRequest request = new IndexRequest(indexName);
        request.id(id);
        request.source(json, XContentType.JSON);
        request.routing("routing");
        esClient.indexAsync(request, RequestOptions.DEFAULT, new ActionListener<IndexResponse>() {
            @Override
            public void onResponse(IndexResponse indexResponse) {
                log.debug("执行情况: " + indexResponse);
            }

            @Override
            public void onFailure(Exception e) {
                log.error("执行失败的原因");
            }
        });
    }

    /**
     * 新增文档-map方式 同步
     *
     * @param indexName 索引名称
     * @param id        文档id
     * @throws IOException
     */
    public void addDocumentMap(String indexName, String id, Map<String, Object> map) throws IOException {
        IndexRequest request = new IndexRequest(indexName).id(id).source(map);
        esClient.index(request, RequestOptions.DEFAULT);
    }

    /**
     * 新增文档-map方式 异步
     *
     * @param indexName 索引名称
     * @param id        文档id
     * @throws IOException
     */
    public void addDocumentMapAsync(String indexName, String id, Map<String, Object> map) {
        IndexRequest request = new IndexRequest(indexName).id(id).source(map);
        esClient.indexAsync(request, RequestOptions.DEFAULT, new ActionListener<IndexResponse>() {
            @Override
            public void onResponse(IndexResponse indexResponse) {
                log.debug("执行情况: " + indexResponse);
            }

            @Override
            public void onFailure(Exception e) {
                log.error("执行失败的原因");
            }
        });
    }

    /**
     * 更新文档-map方式
     *
     * @param indexName 索引名称
     * @param id        文档id
     * @param map       入参map
     * @throws IOException
     */
    public GetResult updateDocumentMap(String indexName, String id, Map<String, Object> map) throws IOException {
        UpdateRequest request = new UpdateRequest(indexName, id).doc(map);
        return esClient.update(request, RequestOptions.DEFAULT).getGetResult();
    }

    /**
     * 删除文档
     *
     * @param indexName
     * @param id
     * @return
     * @throws IOException
     */
    public DeleteResponse delete(String indexName, String id) throws IOException {
        DeleteRequest deleteRequest = new DeleteRequest(indexName, id);
        return esClient.delete(deleteRequest, RequestOptions.DEFAULT);
    }

    /**
     * 查询文档list
     *
     * @param searchRequest
     * @return
     * @throws IOException
     */
    public SearchResponse getDocumentList(SearchRequest searchRequest) throws IOException {
        return esClient.search(searchRequest, RequestOptions.DEFAULT);
    }

    /**
     * multiSearch
     *
     * @param multiSearchRequest
     * @return
     * @throws IOException
     */
    public MultiSearchResponse multiSearch(MultiSearchRequest multiSearchRequest)
            throws IOException {
        log.info("=====query=====:{}", multiSearchRequest);
        return esClient.msearch(multiSearchRequest, RequestOptions.DEFAULT);
    }
}

测试类

@Data
public class ESDemo {

    @JsonProperty("title")
    private String title;

    @JsonProperty("id")
    private Long id;

    @JsonProperty("content")
    private String content;

    public static String[] getAllFields() {
        return new String[]{"title", "id", "content"};
    }

    public static String getTitleField() {
        return "title";
    }

    public static String getIdField() {
        return "id";
    }

    public static String getContentField() {
        return "content";
    }
}

es demo

package pms.simulation.elasticsearch;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.search.MultiSearchRequest;
import org.elasticsearch.action.search.MultiSearchResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.index.query.FuzzyQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import pms.simulation.common.util.ESDemo;
import pms.simulation.common.util.ElasticsearchUtil;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
public class TestSearcher {

    @Autowired
    private ElasticsearchUtil elasticsearchUtil;

    /**
     * 模糊匹配 title
     *
     * @param indexName 索引名称
     * @param from      起始
     * @param size      每批条数
     * @param title
     * @return
     */
    public List<ESDemo> queryFuzzTitle(String indexName, Integer from, Integer size, String title) {
        MultiSearchRequest multiSearchRequest = new MultiSearchRequest();
        SearchRequest searchRequest = new SearchRequest(indexName);
        FuzzyQueryBuilder fuzzyQuery =
                QueryBuilders.fuzzyQuery(ESDemo.getTitleField(), title).fuzziness(Fuzziness.TWO);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(fuzzyQuery);
        sourceBuilder.size(size);
        sourceBuilder.from(from);
        searchRequest.source(sourceBuilder);
        multiSearchRequest.add(searchRequest);
        MultiSearchResponse searchResponse;
        log.info("=====query=====:{}", sourceBuilder);
        List<ESDemo> list = new ArrayList<>();
        try {
            searchResponse = elasticsearchUtil.multiSearch(multiSearchRequest);
            MultiSearchResponse.Item[] responses = searchResponse.getResponses();
            for (MultiSearchResponse.Item item : responses) {
                SearchResponse response = item.getResponse();
                SearchHit[] hits = response.getHits().getHits();
                for (SearchHit hit : hits) {
                    String sourceAsString = hit.getSourceAsString();
                    ESDemo demo = JSON.parseObject(sourceAsString, ESDemo.class);
                    list.add(demo);
                }
            }
        } catch (IOException e) {
            log.error("Search ES Trends  Failed : {}", e.getMessage());
        }
        return list;
    }

    /**
     * 查询文档列表
     *
     * @param indexName 索引名称
     * @param from
     * @param size
     * @return
     * @throws IOException
     */
    public List<ESDemo> queryDocumentList(String indexName, Integer from, Integer size) throws IOException {
        SearchRequest searchRequest = new SearchRequest(indexName);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        searchSourceBuilder.from(from);
        searchSourceBuilder.size(size);
        searchRequest.source(searchSourceBuilder);
        log.info("=====query=====:{}", searchSourceBuilder);
        SearchResponse searchResponse;
        List<ESDemo> list = new ArrayList<>();
        try {
            searchResponse = elasticsearchUtil.getDocumentList(searchRequest);
            SearchHit[] hits = searchResponse.getHits().getHits();
            for (SearchHit hit : hits) {
                String sourceAsString = hit.getSourceAsString();
                ESDemo demo = JSON.parseObject(sourceAsString, ESDemo.class);
                list.add(demo);
            }
        } catch (IOException e) {
            log.error("Search ES test_index  Failed : {}", e.getMessage());
        }
        return list;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch是一个开源的分布式搜索和分析引擎,它被广泛应用于全文搜索、日志分析、数据可视化等领域。Elasticsearch提供了丰富的API和功能,可以方便地进行数据索引、搜索、聚合和分析。 在使用Elasticsearch时,可以使用Java编写工具类来简化与Elasticsearch的交互。下面是一个简单的Elasticsearch工具类的示例: ```java import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.sort.SortOrder; import java.io.IOException; public class ElasticsearchUtils { private RestHighLevelClient client; public ElasticsearchUtils() { client = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http"))); } public SearchResponse search(String index, String field, String keyword) throws IOException { SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchQuery(field, keyword)); sourceBuilder.sort(field, SortOrder.DESC); SearchRequest searchRequest = new SearchRequest(index); searchRequest.source(sourceBuilder); return client.search(searchRequest, RequestOptions.DEFAULT); } public void close() throws IOException { client.close(); } } ``` 上述示例中的工具类使用了Elasticsearch的Java高级客户端(RestHighLevelClient)来与Elasticsearch进行交互。其中,`search`方法用于执行搜索操作,`close`方法用于关闭与Elasticsearch的连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值