博客
关于我
21 Rest高级客户端实践(七):一个小案例
阅读量:248 次
发布时间:2019-03-01

本文共 6669 字,大约阅读时间需要 22 分钟。

准备

在开始编码之前,我们需要准备好以下几个步骤:

  • Indexing previous data
    确保你已经对 Elasticsearch 索引进行了适当的配置。如果你之前已经有数据索引,可以忽略这一步。新建索引时,可以参考以下 JSON 配置:
  • {    "settings": {        "number_of_shards": 3,        "number_of_replicas": 1    },    "mappings": {        "properties": {            "id": {                "type": "long"            },            "title": {                "type": "text",                "analyzer": "ik_max_word"            },            "language": {                "type": "keyword"            },            "author": {                "type": "keyword"            },            "price": {                "type": "double"            },            "publish_time": {                "type": "date",                "format": "yyyy-MM-dd"            },            "description": {                "type": "text",                "analyzer": "ik_max_word"            }        }    }}
    1. 构造搜索请求
      在编码之前,我们需要构造一个有效的搜索请求。以下是一个示例查询请求:
    2. GET books/_search{    "query": {        "bool": {            "filter": [                {                    "term": {                        "author": "张若愚"                    }                }            ],            "must": [                {                    "fuzzy": {                        "title": "python"                    }                }            ],            "must_not": [                {                    "prefix": {                        "language": {                            "value": "j"                        }                    }                }            ],            "should": [                {                    "range": {                        "price": {                            "gte": 0,                            "lte": 100                        }                    }                }            ]        },        "highlight": {            "fields": {                "title": {}            }        },        "_source": {            "excludes": ["id", "publish_time"]        },        "suggest": {            "my_suggest": {                "text": "python",                "term": {                    "field": "description"                }            }        },        "sort": [            {                "price": {                    "order": "desc"                }            }        ]    }}
      1. 查询结果
        上面的请求会返回以下结果示例:
      2. {    "took": 5,    "timed_out": false,    "hits": {        "total": {            "value": 1,            "relation": "eq"        },        "max_score": null,        "hits": [            {                "_index": "books",                "_type": "_doc",                "_id": "3",                "_score": null,                "_source": {                    "author": "张若愚",                    "price": 81.4,                    "description": "零基础学python,光盘中作者独家整合开发winPython运行环境,涵盖了Python各个扩展库",                    "language": "python",                    "title": "Python科学计算"                },                "highlight": {                    "title": [                        "Python科学计算"                    ]                },                "sort": [81.4]            }        ]    }}

        编码

        以下是基于上述准备工作的完整 Java 实现代码:

        package study.wyy.esclient.high;import com.fasterxml.jackson.databind.ObjectMapper;import org.apache.http.HttpHost;import org.elasticsearch.client.RestClient;import org.elasticsearch.client.RestHighLevelClient;public abstract class BaseTest {    public static RestHighLevelClient client;    public static ObjectMapper objectMapper;    static {        client = new RestHighLevelClient(                RestClient.builder(new HttpHost("localhost", 9200, "http"))        );        objectMapper = new ObjectMapper();    }}
        package study.wyy.esclient.high.search;import com.fasterxml.jackson.databind.ObjectMapper;import lombok.extern.slf4j.Slf4j;import org.elasticsearch.action.search.SearchRequest;import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.client.RequestOptions;import org.elasticsearch.common.unit.TimeValue;import org.elasticsearch.index.query.BoolQueryBuilder;import org.elasticsearch.index.query.QueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.elasticsearch.search.builder.SearchSourceBuilder;import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;import org.elasticsearch.search.sort.FieldSortBuilder;import org.elasticsearch.search.sort.SortBuilder;import org.elasticsearch.search.sort.SortOrder;import org.elasticsearch.search.suggest.SuggestBuilder;import org.elasticsearch.search.suggest.SuggestBuilders;import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;import org.junit.Test;import study.wyy.esclient.high.BaseTest;import java.io.IOException;@Slf4jpublic class SearchTest extends BaseTest {    @Test    public void test() throws IOException {        SearchRequest request = buildSearchRequest();        SearchResponse response = client.search(request, RequestOptions.DEFAULT);        log.info(new ObjectMapper().writer().writeValueAsString(response));    }    private SearchRequest buildSearchRequest() {        SearchRequest request = new SearchRequest();        request.indices("books");        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();        searchSourceBuilder.timeout(TimeValue.timeValueSeconds(10));        searchSourceBuilder.from(0);        searchSourceBuilder.size(10);        QueryBuilder queryBuilder = buildQueryParam();        searchSourceBuilder.query(queryBuilder);        HighlightBuilder highlightBuilder = new HighlightBuilder();        HighlightBuilder.Field title = new HighlightBuilder.Field("title");        highlightBuilder.field(title);        searchSourceBuilder.highlighter(highlightBuilder);        SuggestBuilder suggestBuilder = new SuggestBuilder();        TermSuggestionBuilder text = SuggestBuilders.termSuggestion("description").text("python");        suggestBuilder.addSuggestion("my_suggest", text);        searchSourceBuilder.suggest(suggestBuilder);        String[] excludes = { "id", "publish_time" };        searchSourceBuilder.fetchSource(null, excludes);        FieldSortBuilder sortBuilder = new FieldSortBuilder("price").order(SortOrder.DESC);        searchSourceBuilder.sort(sortBuilder);        request.source(searchSourceBuilder);        return request;    }    private QueryBuilder buildQueryParam() {        QueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()                .filter(QueryBuilders.termQuery("author", "张若愚"))                .must(QueryBuilders.fuzzyQuery("title", "python"))                .mustNot(QueryBuilders.prefixQuery("language", "j"))                .should(QueryBuilders.rangeQuery("price").gte(0).lte(100));        return boolQueryBuilder;    }}

    转载地址:http://yirv.baihongyu.com/

    你可能感兴趣的文章
    npm入门,这篇就够了
    查看>>
    npm切换到淘宝源
    查看>>
    npm切换源淘宝源的两种方法
    查看>>
    npm前端包管理工具简介---npm工作笔记001
    查看>>
    npm包管理深度探索:从基础到进阶全面教程!
    查看>>
    npm升级以及使用淘宝npm镜像
    查看>>
    npm发布包--所遇到的问题
    查看>>
    npm发布自己的组件UI包(详细步骤,图文并茂)
    查看>>
    npm和package.json那些不为常人所知的小秘密
    查看>>
    npm和yarn清理缓存命令
    查看>>
    npm和yarn的使用对比
    查看>>
    npm如何清空缓存并重新打包?
    查看>>
    npm学习(十一)之package-lock.json
    查看>>
    npm安装 出现 npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! 解决方法
    查看>>
    npm安装crypto-js 如何安装crypto-js, python爬虫安装加解密插件 找不到模块crypto-js python报错解决丢失crypto-js模块
    查看>>
    npm安装教程
    查看>>
    npm报错Cannot find module ‘webpack‘ Require stack
    查看>>
    npm报错Failed at the node-sass@4.14.1 postinstall script
    查看>>
    npm报错fatal: Could not read from remote repository
    查看>>
    npm报错File to import not found or unreadable: @/assets/styles/global.scss.
    查看>>