博客
关于我
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/

    你可能感兴趣的文章
    Netty中集成Protobuf实现Java对象数据传递
    查看>>
    Netty工作笔记0006---NIO的Buffer说明
    查看>>
    Netty工作笔记0011---Channel应用案例2
    查看>>
    Netty工作笔记0013---Channel应用案例4Copy图片
    查看>>
    Netty工作笔记0014---Buffer类型化和只读
    查看>>
    Netty工作笔记0020---Selectionkey在NIO体系
    查看>>
    Vue踩坑笔记 - 关于vue静态资源引入的问题
    查看>>
    Netty工作笔记0025---SocketChannel API
    查看>>
    Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
    查看>>
    Netty工作笔记0050---Netty核心模块1
    查看>>
    Netty工作笔记0077---handler链调用机制实例4
    查看>>
    Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
    查看>>
    Netty常见组件二
    查看>>
    netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
    查看>>
    Netty核心模块组件
    查看>>
    Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
    查看>>
    Netty源码—2.Reactor线程模型一
    查看>>
    Netty源码—4.客户端接入流程一
    查看>>
    Netty源码—4.客户端接入流程二
    查看>>
    Netty源码—5.Pipeline和Handler一
    查看>>