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

    你可能感兴趣的文章
    nginx 配置 单页面应用的解决方案
    查看>>
    nginx 配置https(一)—— 自签名证书
    查看>>
    nginx 配置~~~本身就是一个静态资源的服务器
    查看>>
    Nginx 配置解析:从基础到高级应用指南
    查看>>
    nginx+Tomcat性能监控
    查看>>
    Nginx下配置codeigniter框架方法
    查看>>
    nginx报错:the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:128
    查看>>
    nginx添加模块与https支持
    查看>>
    Nginx用户认证
    查看>>
    Nginx的Rewrite正则表达式,匹配非某单词
    查看>>
    Nginx的使用总结(一)
    查看>>
    Nginx的使用总结(二)
    查看>>
    Nginx的可视化神器nginx-gui的下载配置和使用
    查看>>
    Nginx的是什么?干什么用的?
    查看>>
    Nginx访问控制_登陆权限的控制(http_auth_basic_module)
    查看>>
    nginx负载均衡器处理session共享的几种方法(转)
    查看>>
    nginx负载均衡的5种策略(转载)
    查看>>
    nginx负载均衡的五种算法
    查看>>
    Nginx运维与实战(二)-Https配置
    查看>>
    Nginx配置ssl实现https
    查看>>