ElasticSearch查询索引

本文介绍了如何使用Elasticsearch进行高级搜索,通过`multiMatchQuery`实现对多个字段的精确匹配,包括`keyword`、`tester`和`name`。展示了参数设置和查询构建过程。
/**
 * 查询
 * @param index         索引
 * @param type          数据类型
 * @param searchParam   搜索条件
 * @return
 */
public <T> List<T> search(String index, Class<T> type, SearchParam searchParam) {
    String keyword = searchParam.getKeyword();
    System.out.println("keyword = " + keyword);
    //构建搜索条件
    SearchRequest request = new SearchRequest(index);

    SearchSourceBuilder builder = new SearchSourceBuilder();
    // builder.query(QueryBuilders.termQuery("brand",keyword));
    // builder.query(QueryBuilders.matchPhraseQuery ("name",keyword));
    builder.query(QueryBuilders.multiMatchQuery(keyword,"tester","name","brand"));

    request.source(builder);
    System.out.println("request = " + request);
    List<T> entityList = new ArrayList<>();
    try {
        SearchResponse response = client.search(request, ElasticConfig.COMMON_OPTIONS);
        System.out.println("response = " + response.toString());
        SearchHits hits = response.getHits();
        SearchHit[] searchHits = hits.getHits();
        Arrays.stream(searchHits).forEach(hit -> {
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            T t = null;
            try {
                t = BeanUtil.fillBeanWithMap(sourceAsMap, type.newInstance(), false);
            } catch (InstantiationException | IllegalAccessException e) {
                e.printStackTrace();
            }
            entityList.add(t);
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
    return entityList;
}
Elasticsearch(简称 ES)是基于 Apache Lucene 构建的开源搜索引擎,提供了简单易用的 RestFul API 用于开发搜索功能[^2]。以下介绍一些常见的 ES 查询索引的方法和示例: ### 简单的查询示例 可以使用 HTTP 请求来查询 ES 索引。例如,要查询名为 `song001` 索引下的文档,可以使用如下的请求: ```bash curl -X GET "http://127.0.0.1:9200/song001/_search" ``` 这个请求会返回 `song001` 索引下的所有文档。 ### 带查询条件的示例 如果要根据特定条件查询,比如查询 `song001` 索引中 `singer` 为 `杨坤` 的文档,可以使用如下的请求: ```bash curl -X GET "http://127.0.0.1:9200/song001/_search" -H 'Content-Type: application/json' -d' { "query": { "match": { "singer": "杨坤" } } } ' ``` ### 在 Spring Boot 项目中使用 ES 查询 在 Spring Boot 项目中使用 ES 查询,首先需要引入依赖,在 `<properties>` 标签下添加 `<elasticsearch.version>7.4.2</elasticsearch.version>`,并且添加相应的依赖配置 [^3]。 以下是一个简单的 Java 代码示例,使用 Spring Data Elasticsearch 进行查询: ```java import org.elasticsearch.index.query.MatchQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.SearchHit; import org.springframework.data.elasticsearch.core.SearchHits; import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.stereotype.Service; import java.util.List; import java.util.stream.Collectors; @Service public class SongSearchService { @Autowired private ElasticsearchOperations elasticsearchOperations; public List<Song> searchSongsBySinger(String singer) { MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("singer", singer); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(queryBuilder) .build(); SearchHits<Song> searchHits = elasticsearchOperations.search(searchQuery, Song.class); return searchHits.getSearchHits().stream() .map(SearchHit::getContent) .collect(Collectors.toList()); } } class Song { private int number; private String singer; private String size; private String song; private String tag; private int timelen; // Getters and Setters public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public String getSinger() { return singer; } public void setSinger(String singer) { this.singer = singer; } public String getSize() { return size; } public void setSize(String size) { this.size = size; } public String getSong() { return song; } public void setSong(String song) { this.song = song; } public String getTag() { return tag; } public void setTag(String tag) { this.tag = tag; } public int getTimelen() { return timelen; } public void setTimelen(int timelen) { this.timelen = timelen; } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值