国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

通過java代碼實現(xiàn)ES中的常用搜索

這篇具有很好參考價值的文章主要介紹了通過java代碼實現(xiàn)ES中的常用搜索。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

測試環(huán)境準(zhǔn)備

在指定索引下搜索全部(可以指定字段)

通過ids進(jìn)行搜索

對搜索結(jié)果進(jìn)行分頁

match分詞搜索

不分詞模糊搜索:wildcardQuery與matchPhraseQuery

term 搜索(精確匹配)

multi_match搜索

bool搜索 多條件匹配

filter過濾搜索

sort排序搜索

后續(xù)待補充:queryStringQuery,minimumShouldMatch,對檢索結(jié)果中的關(guān)鍵詞進(jìn)行高亮


測試環(huán)境準(zhǔn)備

測試環(huán)境:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.0.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <version>2.0.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.3.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.3.0</version>
</dependency>

2配置 application.yml

spring:
  application:
    name: service-search
eslearn:
  elasticsearch:
    hostlist: 127.0.0.1:9200 #多個結(jié)點中間用逗號分隔

?3主類代碼

@SpringBootApplication
public class SearchApplication {
    public static void main(String[] args) {
        SpringApplication.run(SearchApplication.class,args);
    }
}

配置類:

package com.learn.es.cofig;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author LJM
 * @create 2022/12/10
 */
@Configuration
public class ElasticSearchConfig {
    
    @Value("${eslearn.elasticsearch.hostlist}")
    private String hostList;
    
    @Bean(destroyMethod = "close") //表示連接使用完成后需要關(guān)閉
    public RestHighLevelClient restHighLevelClient(){
        String[] split = hostList.split(",");
        //這種寫法是考慮到可能會配置多個es節(jié)點
        HttpHost[] httpHosts = new HttpHost[split.length];
        for (int i = 0; i < split.length; i++) {
            String item = split[i];
            httpHosts[i] = new HttpHost(item.split(":")[0],Integer.parseInt(item.split(":")[1]),"http");
        }

        return new RestHighLevelClient(RestClient.builder(httpHosts));
    }
    
}

測試項目結(jié)構(gòu):

java es搜索引擎,elasticsearch,java,elasticsearch,spring boot

?在kibana中把數(shù)據(jù)插入es中:

delete book   //先刪除索引

PUT /book    //往索引中插入數(shù)據(jù)進(jìn)行測試,后面在api實現(xiàn)搜索的小節(jié),可以使用從數(shù)據(jù)庫中讀取數(shù)據(jù) 然后把數(shù)據(jù)插入es庫指定的索引

PUT /book/_doc/1
{
"name": "Bootstrap開發(fā)",
"description": "Bootstrap是由Twitter推出的一個前臺頁面開發(fā)css框架,是一個非常流行的開發(fā)框架,此框架集成了多種頁面效果。此開發(fā)框架包含了大量的CSS、JS程序代碼,可以幫助開發(fā)者(尤其是不擅長css頁面開發(fā)的程序人員)輕松的實現(xiàn)一個css,不受瀏覽器限制的精美界面css效果。",
"studymodel": "201002",
"price":38.6,
"timestamp":"2019-08-25 19:11:35",
"pic":"group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags": [ "bootstrap", "dev"]
}


PUT /book/_doc/2
{
"name": "java編程思想",
"description": "java語言是世界第一編程語言,在軟件開發(fā)領(lǐng)域使用人數(shù)最多。",
"studymodel": "201001",
"price":68.6,
"timestamp":"2019-08-25 19:11:35",
"pic":"group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags": [ "java", "dev"]
}




PUT /book/_doc/3
{
"name": "spring開發(fā)基礎(chǔ)",
"description": "spring 在java領(lǐng)域非常流行,java程序員都在用。",
"studymodel": "201001",
"price":88.6,
"timestamp":"2019-08-24 19:11:35",
"pic":"group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags": [ "spring", "java"]
}

測試類代碼結(jié)構(gòu):?

/**
 * @author LJM
 * @create 2022/12/13
 * 測試使用java代碼實現(xiàn)es的各種搜索
 */
@SpringBootTest(classes = SearchApplication.class)
@RunWith(SpringRunner.class)
public class TestSearch {
    @Autowired
    RestHighLevelClient client;

// 后面的測試方法會全部寫在這個類中 .....

}

在指定索引下搜索全部(可以指定字段)

在kibana中 GET /book/_search 先獲取一下本地es庫中的book索引下有多少數(shù)據(jù)。

/**
     *     搜索全部
     *       GET book/_search
     *       {
     *         "query": {
     *          "match_all": {}
     *          }
     *       }
     * @throws IOException
     */
    @Test
    public void testSearchAll() throws IOException {

        //1構(gòu)建搜索請求  實際生產(chǎn)環(huán)境中這個索引名稱的獲取:①把這個索引名稱寫在枚舉類中,然后從枚舉類中獲取②從配置文件中獲取
        SearchRequest searchRequest = new SearchRequest("book");

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());

        //獲取某些字段
        searchSourceBuilder.fetchSource(new String[]{"name"}, new String[]{});

        searchRequest.source(searchSourceBuilder);

        //2執(zhí)行搜索
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        //3獲取結(jié)果
        SearchHits hits = searchResponse.getHits();

        //數(shù)據(jù)數(shù)據(jù)
        SearchHit[] searchHits = hits.getHits();
        System.out.println("--------------------------");
        for (SearchHit hit : searchHits) {
            String id = hit.getId();
            float score = hit.getScore();
            //這個source里面就是我們存儲的數(shù)據(jù)
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            String description = (String) sourceAsMap.get("description");
            Double price = (Double) sourceAsMap.get("price");
            System.out.println("id:" + id);
            System.out.println("score:" + score);
            System.out.println("name:" + name);
            System.out.println("description:" + description);
            System.out.println("price:" + price);
            System.out.println("==========================");

        }
    }

通過ids進(jìn)行搜索

 /**
     * 通過ids進(jìn)行搜索  有的就查詢出來,沒有的也不會報錯
     *     GET /book/_search
     *     {
     *         "query": {
     *            "ids" : {
     *              "values" : ["1", "2", "6"]
     *              }
     *         }
     *     }
     * @throws IOException
     */
    @Test
    public void testSearchIds() throws IOException {

        //1構(gòu)建搜索請求
        SearchRequest searchRequest = new SearchRequest("book");

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.idsQuery().addIds("1","2","6"));

        searchRequest.source(searchSourceBuilder);

        //2執(zhí)行搜索
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        //3獲取結(jié)果
        SearchHits hits = searchResponse.getHits();

        //數(shù)據(jù)數(shù)據(jù)
        SearchHit[] searchHits = hits.getHits();
        System.out.println("--------------------------");
        for (SearchHit hit : searchHits) {
            String id = hit.getId();
            float score = hit.getScore();
            //這個source里面就是我們存儲的數(shù)據(jù)
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            String description = (String) sourceAsMap.get("description");
            Double price = (Double) sourceAsMap.get("price");
            System.out.println("id:" + id);
            System.out.println("name:" + name);
            System.out.println("description:" + description);
            System.out.println("price:" + price);
            System.out.println("==========================");

        }
    }

對搜索結(jié)果進(jìn)行分頁

    /**
     *     對搜索結(jié)果進(jìn)行分頁
     *         GET book/_search
     *         {
     *             "query": {
     *               "match_all": {}
     *            },
     *             "from": 0,
     *             "size": 2
     *         }
     */
    @Test
    public void testSearchPage() throws IOException {
        //1構(gòu)建搜索請求
        SearchRequest searchRequest = new SearchRequest("book");

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());

        //搜索第幾頁的數(shù)據(jù)
        int page=1;
        //每頁展示幾個數(shù)據(jù)
        //int size=2;  //因為本地es一共就插入了三條數(shù)據(jù)進(jìn)行測試,所以可以把大小分別設(shè)置為2和3看一下輸出效果
        int size=3;
        //下標(biāo)計算
        int from = (page-1) / size;

        searchSourceBuilder.from(from);
        searchSourceBuilder.size(size);

        searchRequest.source(searchSourceBuilder);

        //2執(zhí)行搜索
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        //3獲取結(jié)果
        SearchHits hits = searchResponse.getHits();

        //數(shù)據(jù)數(shù)據(jù)
        SearchHit[] searchHits = hits.getHits();
        System.out.println("--------------------------");
        for (SearchHit hit : searchHits) {
            String id = hit.getId();
            float score = hit.getScore();
            //這個source里面就是我們存儲的數(shù)據(jù)
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            String description = (String) sourceAsMap.get("description");
            Double price = (Double) sourceAsMap.get("price");
            System.out.println("id:" + id);
            System.out.println("name:" + name);
            System.out.println("description:" + description);
            System.out.println("price:" + price);
            System.out.println("==========================");

        }
    }

match分詞搜索

 /**
     * match搜索  這個是會進(jìn)行分詞搜索的
     *     GET /book/_search
     *     {
     *         "query": {
     *            "match": {
     *             "description": "java程序員"
     *         }
     *       }
     *     }
     * @throws IOException
     */
    @Test
    public void testSearchMatch() throws IOException {
        //1構(gòu)建搜索請求
        SearchRequest searchRequest = new SearchRequest("book");

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchQuery("description", "java程序員"));


        searchRequest.source(searchSourceBuilder);

        //2執(zhí)行搜索
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        //3獲取結(jié)果
        SearchHits hits = searchResponse.getHits();

        //數(shù)據(jù)數(shù)據(jù)
        SearchHit[] searchHits = hits.getHits();
        System.out.println("--------------------------");
        for (SearchHit hit : searchHits) {
            String id = hit.getId();
            float score = hit.getScore();
            //這個source里面就是我們存儲的數(shù)據(jù)
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            String description = (String) sourceAsMap.get("description");
            Double price = (Double) sourceAsMap.get("price");
            System.out.println("id:" + id);
            System.out.println("name:" + name);
            System.out.println("description:" + description);
            System.out.println("price:" + price);
            System.out.println("==========================");

        }
    }

不分詞模糊搜索:wildcardQuery與matchPhraseQuery

    /**
     * 不分詞模糊搜索   like '%檢索詞%'
     * @throws IOException
     */
    @Test
    public void testSearchLike() throws IOException {
        //1構(gòu)建搜索請求
        SearchRequest searchRequest = new SearchRequest("book");

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //使用matchPhraseQuery 需要對檢索的關(guān)鍵詞的前后加 * 否則不是完全的模糊匹配  可以對檢索的結(jié)果中的檢索關(guān)鍵詞進(jìn)行高亮
        searchSourceBuilder.query(QueryBuilders.matchPhraseQuery("description", "*"+"程序員"+"*"));

        //還可以使用wildcardQuery 但是這種就會導(dǎo)致檢索的結(jié)果不能高亮(這個不太確定,但是我自己試的時候,這樣確實是不能對檢索結(jié)果中的檢索詞進(jìn)行高亮)
        //需要在檢索的字段名后拼接 ".keyword"  并且也需要對檢索詞前后添加 *
//        searchSourceBuilder.query(QueryBuilders.wildcardQuery("description"+".keyword","*"+"程序員"+"*"));



        searchRequest.source(searchSourceBuilder);

        //2執(zhí)行搜索
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        //3獲取結(jié)果
        SearchHits hits = searchResponse.getHits();

        //數(shù)據(jù)數(shù)據(jù)
        SearchHit[] searchHits = hits.getHits();
        System.out.println("--------------------------");
        for (SearchHit hit : searchHits) {
            String id = hit.getId();
            float score = hit.getScore();
            //這個source里面就是我們存儲的數(shù)據(jù)
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            String description = (String) sourceAsMap.get("description");
            Double price = (Double) sourceAsMap.get("price");
            System.out.println("id:" + id);
            System.out.println("name:" + name);
            System.out.println("description:" + description);
            System.out.println("price:" + price);
            System.out.println("==========================");

        }
    }

term 搜索(精確匹配)

 /**
     * term 搜索  如果字段為keyword那么【存儲】和【搜索】都不分詞。 搜索的時候相當(dāng)于在使用 = 符號進(jìn)行搜索
     *        GET / book / _search
     *         {
     *             "query":{
     *                 "term":{
     *                     "description":"java程序員"
     *                 }
     *             }
     *         }
     * @throws IOException
     */
    @Test
    public void testSearchTerm() throws IOException {

        //1構(gòu)建搜索請求
        SearchRequest searchRequest = new SearchRequest("book");

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //如果字段的映射是text但是也想要精確匹配,可以這樣操作:QueryBuilders.termQuery("description" + ".keyword","java程序員")
        searchSourceBuilder.query(QueryBuilders.termQuery("description", "java語言"));

        searchRequest.source(searchSourceBuilder);

        //2執(zhí)行搜索
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        //3獲取結(jié)果
        SearchHits hits = searchResponse.getHits();

        //數(shù)據(jù)數(shù)據(jù)
        SearchHit[] searchHits = hits.getHits();
        System.out.println("--------------------------");
        for (SearchHit hit : searchHits) {
            String id = hit.getId();
            float score = hit.getScore();
            //這個source里面就是我們存儲的數(shù)據(jù)
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            String description = (String) sourceAsMap.get("description");
            Double price = (Double) sourceAsMap.get("price");
            System.out.println("id:" + id);
            System.out.println("name:" + name);
            System.out.println("description:" + description);
            System.out.println("price:" + price);
            System.out.println("==========================");

        }
    }

multi_match搜索

    /**
     * multi_match搜索
     *     GET /book/_search
     *     {
     *         "query": {
     *           "multi_match": {
     *             "query": "java程序員",
     *             "fields": ["name", "description"]
     *         }
     *       }
     *     }
     * @throws IOException
     */
    @Test
    public void testSearchMultiMatch() throws IOException {

        //1構(gòu)建搜索請求
        SearchRequest searchRequest = new SearchRequest("book");

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //第二個參數(shù)才是 字段  第一個參數(shù)是匹配的內(nèi)容
        searchSourceBuilder.query(QueryBuilders.multiMatchQuery("java程序員","name","description"));

        searchRequest.source(searchSourceBuilder);

        //2執(zhí)行搜索
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        //3獲取結(jié)果
        SearchHits hits = searchResponse.getHits();

        //數(shù)據(jù)數(shù)據(jù)
        SearchHit[] searchHits = hits.getHits();
        System.out.println("--------------------------");
        for (SearchHit hit : searchHits) {
            String id = hit.getId();
            float score = hit.getScore();
            //這個source里面就是我們存儲的數(shù)據(jù)
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            String description = (String) sourceAsMap.get("description");
            Double price = (Double) sourceAsMap.get("price");
            System.out.println("id:" + id);
            System.out.println("name:" + name);
            System.out.println("description:" + description);
            System.out.println("price:" + price);
            System.out.println("==========================");

        }
    }

bool搜索 多條件匹配

    /**
     * bool搜索 多條件匹配  and or !=
     *         GET / book / _search
     *         {
     *          "query":{
     *             "bool":{
     *                 "must": [
     *                 {
     *                     "multi_match":{
     *                     "query":"java程序員",
     *                             "fields": ["name", "description"]
     *                     }
     *                 }
     *                 ],
     *                 "should": [
     *                     {
     *                         "match":{
     *                         "studymodel":"201001"
     *                     }
     *                 }
     *                 ]
     *             }
     *         }
     *       }
     * @throws IOException
     */
    @Test
    public void testSearchBool() throws IOException {

        //1構(gòu)建搜索請求
        SearchRequest searchRequest = new SearchRequest("book");

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        //構(gòu)建multiMatch請求 第一個參數(shù)是檢索內(nèi)容 第二個參數(shù)是檢索的字段
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("java程序員", "name", "description");
        //構(gòu)建match請求
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "測試沒有的字段");

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(multiMatchQueryBuilder);
        boolQueryBuilder.should(matchQueryBuilder);
        //        boolQueryBuilder.must(matchQueryBuilder); //把should改成must就相當(dāng)于用 and進(jìn)行了再一次的過濾 就會查詢不到數(shù)據(jù)

        searchSourceBuilder.query(boolQueryBuilder);
        searchRequest.source(searchSourceBuilder);

        //2執(zhí)行搜索
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        //3獲取結(jié)果
        SearchHits hits = searchResponse.getHits();

        //數(shù)據(jù)數(shù)據(jù)
        SearchHit[] searchHits = hits.getHits();
        System.out.println("--------------------------");
        for (SearchHit hit : searchHits) {
            String id = hit.getId();
            float score = hit.getScore();
            //這個source里面就是我們存儲的數(shù)據(jù)
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            String description = (String) sourceAsMap.get("description");
            Double price = (Double) sourceAsMap.get("price");
            System.out.println("id:" + id);
            System.out.println("name:" + name);
            System.out.println("description:" + description);
            System.out.println("price:" + price);
            System.out.println("==========================");

        }
    }

}

filter過濾搜索

過濾搜索和范圍搜索的區(qū)別:

filter,僅僅只是按照搜索條件過濾出需要的數(shù)據(jù)而已,不計算任何相關(guān)度分?jǐn)?shù),對相關(guān)度沒有任何影響。

query,會去計算每個document相對于搜索條件的相關(guān)度,并按照相關(guān)度進(jìn)行排序。文章來源地址http://www.zghlxwxcb.cn/news/detail-801775.html

    /**
     * filter過濾搜索
     *     GET /book/_search
     *     {
     *         "query": {
     *           "bool": {
     *             "must": [
     *             {
     *                 "multi_match": {
     *                 "query": "java程序員",
     *                         "fields": ["name","description"]
     *                                      }
     *             }
     *       ],
     *             "should": [
     *             {
     *                 "match": {
     *                 "studymodel": "201001"
     *             }
     *             }
     *           ],
     *             "filter": {
     *                 "range": {
     *                     "price": {
     *                         "gte": 50,
     *                          "lte": 90
     *                     }
     *                 }
     *
     *             }
     *         }
     *     }
     *  }
     * @throws IOException
     */
    @Test
    public void testSearchFilter() throws IOException {

        //1構(gòu)建搜索請求
        SearchRequest searchRequest = new SearchRequest("book");

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        //構(gòu)建multiMatch請求
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("java程序員", "name", "description");
        //構(gòu)建match請求
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("studymodel", "201001");

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(multiMatchQueryBuilder);
        boolQueryBuilder.should(matchQueryBuilder);

        boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(50).lte(90));

        searchSourceBuilder.query(boolQueryBuilder);

        searchRequest.source(searchSourceBuilder);

        //2執(zhí)行搜索
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        //3獲取結(jié)果
        SearchHits hits = searchResponse.getHits();

        //數(shù)據(jù)數(shù)據(jù)
        SearchHit[] searchHits = hits.getHits();
        System.out.println("--------------------------");
        for (SearchHit hit : searchHits) {
            String id = hit.getId();
            float score = hit.getScore();
            //這個source里面就是我們存儲的數(shù)據(jù)
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            String description = (String) sourceAsMap.get("description");
            Double price = (Double) sourceAsMap.get("price");
            System.out.println("id:" + id);
            System.out.println("name:" + name);
            System.out.println("description:" + description);
            System.out.println("price:" + price);
            System.out.println("==========================");

        }
    }

sort排序搜索

    /**
     * sort排序搜索
     *     GET /book/_search
     *     {
     *         "query": {
     *         "bool": {
     *             "must": [
     *             {
     *                 "multi_match": {
     *                 "query": "java程序員",
     *                         "fields": ["name","description"]
     *             }
     *             }
     *       ],
     *             "should": [
     *             {
     *                 "match": {
     *                 "studymodel": "201001"
     *             }
     *             }
     *       ],
     *             "filter": {
     *                 "range": {
     *                     "price": {
     *                         "gte": 50,
     *                                 "lte": 90
     *                     }
     *                 }
     *
     *             }
     *         }
     *     },
     *         "sort": [
     *         {
     *             "price": {
     *             "order": "asc"
     *         }
     *         }
     *   ]
     *     }
     * @throws IOException
     */
    @Test
    public void testSearchSort() throws IOException {

        //1構(gòu)建搜索請求
        SearchRequest searchRequest = new SearchRequest("book");

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        //構(gòu)建multiMatch請求
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("java程序員", "name", "description");
        //構(gòu)建match請求
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("studymodel", "201001");

        BoolQueryBuilder boolQueryBuilder=QueryBuilders.boolQuery();
        boolQueryBuilder.must(multiMatchQueryBuilder);
        boolQueryBuilder.should(matchQueryBuilder);

        boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(50).lte(90));

        searchSourceBuilder.query(boolQueryBuilder);

        //按照價格升序
        searchSourceBuilder.sort("price", SortOrder.ASC);


        searchRequest.source(searchSourceBuilder);

        //2執(zhí)行搜索
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        //3獲取結(jié)果
        SearchHits hits = searchResponse.getHits();

        //數(shù)據(jù)數(shù)據(jù)
        SearchHit[] searchHits = hits.getHits();
        System.out.println("--------------------------");
        for (SearchHit hit : searchHits) {
            String id = hit.getId();
            float score = hit.getScore();
            //這個source里面就是我們存儲的數(shù)據(jù)
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            String description = (String) sourceAsMap.get("description");
            Double price = (Double) sourceAsMap.get("price");
            System.out.println("id:" + id);
            System.out.println("name:" + name);
            System.out.println("description:" + description);
            System.out.println("price:" + price);
            System.out.println("==========================");
        }
    }

后續(xù)待補充:queryStringQuery,minimumShouldMatch,對檢索結(jié)果中的關(guān)鍵詞進(jìn)行高亮

到了這里,關(guān)于通過java代碼實現(xiàn)ES中的常用搜索的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 詳解最熱門搜索引擎——ES

    詳解最熱門搜索引擎——ES

    ? 互聯(lián)網(wǎng)發(fā)展早期的時候,對于一般的公司儲存的數(shù)據(jù)量不是那么的大,所以很多公司更傾向于使用數(shù)據(jù)庫去存儲和查詢數(shù)據(jù),如:現(xiàn)在去MySQL中查詢數(shù)據(jù),大概的查詢方式就是:select * from table where filed like “%XXX%”或者其他方式,但是,如果我們在查詢的時候沒有用到或命

    2023年04月10日
    瀏覽(17)
  • 分布式搜索引擎ES

    分布式搜索引擎ES

    elasticsearch的作用 elasticsearch是一款非常強大的開源搜索引擎,具備非常多強大功能,可以幫助我們從海量數(shù)據(jù)中快速找到需要的內(nèi)容 例如: 在GitHub搜索代碼 在電商網(wǎng)站搜索商品 在百度搜索答案 ELK技術(shù)棧 elasticsearch結(jié)合kibana、Logstash、Beats,也就是elastic stack(ELK)。被廣泛應(yīng)

    2024年02月04日
    瀏覽(29)
  • 【分布式搜索引擎es】

    【分布式搜索引擎es】

    elasticsearch最擅長的是 搜索 和 數(shù)據(jù)分析 。 查詢文檔 常見的查詢類型包括: 查詢所有 :查詢出所有數(shù)據(jù),一般測試用。例如:match_all 全文檢索(full text)查詢 :利用分詞器對用戶輸入內(nèi)容分詞,然后去倒排索引庫中匹配。例如: match_query multi_match_query 精確查詢 :根據(jù)精確

    2024年02月10日
    瀏覽(26)
  • Elasticsearch (ES) 搜索引擎: 搜索功能:搜索分頁、搜索匹配、全文搜索、搜索建議、字段排序

    原文鏈接:https://xiets.blog.csdn.net/article/details/132348920 版權(quán)聲明:原創(chuàng)文章禁止轉(zhuǎn)載 專欄目錄:Elasticsearch 專欄(總目錄) ES 搜索 API 官網(wǎng)文檔:Search APIs 先創(chuàng)建一個索引,并寫入一些文檔用于搜索示例: 寫入一些文檔示例: 官網(wǎng)API:The _source option 搜索結(jié)果中的文檔數(shù)據(jù)封裝

    2024年02月08日
    瀏覽(33)
  • RediSearch比Es搜索還快的搜索引擎

    RediSearch比Es搜索還快的搜索引擎

    RediSearch是一個Redis模塊,為Redis提供查詢、二次索引和全文搜索。要使用RediSearch,首先要在Redis數(shù)據(jù)上聲明索引。然后可以使用重新搜索查詢語言來查詢該數(shù)據(jù)。RedSearch使用壓縮的反向索引進(jìn)行快速索引,占用內(nèi)存少。RedSearch索引通過提供精確的短語匹配、模糊搜索和數(shù)字過

    2024年04月11日
    瀏覽(17)
  • 分布式搜索引擎es-3

    分布式搜索引擎es-3

    什么是聚合? 聚合 可以讓我們極其方便的實現(xiàn)對數(shù)據(jù)的統(tǒng)計、分析、運算。例如: 什么 品牌 的手機(jī)最受歡迎? 這些手機(jī)的 平均 價格、 最高 價格、 最低 價格? 這些手機(jī)每 月的銷售情況 如何? 實現(xiàn)這些統(tǒng)計功能的比數(shù)據(jù)庫的sql要方便的多,而且查詢速度非??欤梢詫?/p>

    2024年02月07日
    瀏覽(26)
  • 搜索引擎ES-RestHighLevelClient

    搜索引擎ES-RestHighLevelClient

    前言:本篇文章,主要講述如何引入RestHighLevelClient,以及對其API的調(diào)用,屬于入門級別的接口實用。適用于由于工作需要及時了解的童靴們以及初學(xué)者。想要了解ES底層更多內(nèi)容的童鞋們,本篇文章并不適合 ! 前言:對比mysql,了解ES 首先通過圖片對比我們了解的關(guān)系型數(shù)據(jù)

    2024年02月08日
    瀏覽(15)
  • 分布式搜索分析引擎ES

    分布式搜索分析引擎ES

    es是實時的分布式搜索分析引擎: 實時表現(xiàn)在新增到ES中的數(shù)據(jù)1s中就可以被檢索到,這種新增數(shù)據(jù)對搜索的可見性成為“準(zhǔn)實時搜索”。 分布式意味著可以動態(tài)調(diào)整集群規(guī)模,彈性擴(kuò)容,支持上百個節(jié)點,相比 HDFS 等上千臺的集群,更適合中等數(shù)據(jù)量的業(yè)務(wù),不適合存儲海

    2024年03月12日
    瀏覽(27)
  • ElasticSearch內(nèi)容分享(四):ES搜索引擎

    ElasticSearch內(nèi)容分享(四):ES搜索引擎

    目錄 ES搜索引擎 1. DSL設(shè)置查詢條件 1.1 DSL查詢分類 1.2 全文檢索查詢 1.2.1 使用場景 1.2.2 match查詢 1.2.3 mulit_match查詢 1.3 精準(zhǔn)查詢 1.3.1 term查詢 1.3.2 range查詢 1.4 地理坐標(biāo)查詢 1.4.1 矩形范圍查詢 1.4.2 附近(圓形)查詢 1.5 復(fù)合查詢 1.5.0 復(fù)合查詢歸納 1.5.1 相關(guān)性算分 1.5.2 算分函數(shù)查

    2024年02月05日
    瀏覽(25)
  • 分布式搜索引擎es 面試突擊

    分布式搜索引擎es 面試突擊

    es elastocsearch 倒排索引 是在數(shù)據(jù)查詢之前建立,在查詢的時候可以直接通過定位到文檔內(nèi)容。用空間換時間 分布式架構(gòu)原理說一下? es底層是基于lucene來的? ?大概就是一個用于全文檢索的jar包 用es來做分布式的搜索引擎? 可以承載一秒鐘幾千的搜索 es用來存儲數(shù)據(jù)的

    2024年02月06日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包