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

    你可能感兴趣的文章
    nodejs 运行CMD命令
    查看>>
    nodejs-mime类型
    查看>>
    nodejs中Express 路由统一设置缓存的小技巧
    查看>>
    NodeJs学习笔记001--npm换源
    查看>>
    Node入门之创建第一个HelloNode
    查看>>
    Node出错导致运行崩溃的解决方案
    查看>>
    Node提示:error code Z_BUF_ERROR,error error -5,error zlib:unexpected end of file
    查看>>
    NOIp2005 过河
    查看>>
    NOPI读取Excel
    查看>>
    NoSQL&MongoDB
    查看>>
    NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()
    查看>>
    npm install报错,证书验证失败unable to get local issuer certificate
    查看>>
    npm run build 失败Compiler server unexpectedly exited with code: null and signal: SIGBUS
    查看>>
    npm run build报Cannot find module错误的解决方法
    查看>>
    npm run build部署到云服务器中的Nginx(图文配置)
    查看>>
    npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
    查看>>
    npm切换到淘宝源
    查看>>
    npm前端包管理工具简介---npm工作笔记001
    查看>>
    npm和yarn清理缓存命令
    查看>>
    npm和yarn的使用对比
    查看>>