本文共 6669 字,大约阅读时间需要 22 分钟。
在开始编码之前,我们需要准备好以下几个步骤:
{ "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" } } }} 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" } } ] }} { "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/