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

    你可能感兴趣的文章
    Python 常见的错误类型和继承关系
    查看>>
    python 常量_零基础学Python系列之一:Python的变量与常量
    查看>>
    Python 并发编程
    查看>>
    Python编程入门基础及高级技能、Web开发、数据分析和机器学习与人工智能
    查看>>
    python 序列化操作
    查看>>
    Python 开发者,这 7 个 VS Code 插件极力推荐
    查看>>
    python手把手视频_硬货 | 手把手带你构建视频分类模型(附Python演练))
    查看>>
    python 录音左右声道_Python分离立体声wav压缩文件的左右声道
    查看>>
    Python 循环异或对文件进行加解密
    查看>>
    Python开发环境搭建(附VMware安装包及虚拟机环境)
    查看>>
    python 微信扫码登录_python实现微信第三方网站扫码登录(Django)
    查看>>
    Python 快速下载依赖
    查看>>
    python实现非参数统计的Cochran检验 (附完整源码)
    查看>>
    python 怎么验证是否安装成功 scrapy
    查看>>
    Python 手写数字识别-1
    查看>>
    Python实现接口自动化测试库(JSON与Requests)详解
    查看>>
    Python 手写数字识别-3-sklearn中的几种算法
    查看>>
    python实现SSIM和MSSSIM计算 (附完整源码)
    查看>>
    Python 打开文件注意事项
    查看>>
    python 批量修改文件名_python windows下批量修改文件名
    查看>>