- 模糊查询
- 高亮查询
主要是使用QueryBuilders.fuzzyQuery("name", "wangwu")
进行模糊查询, 第一参数为要模糊查询的字段, 第二字段为要模糊查询的值. .fuzziness(Fuzziness.TWO)
用于表示能够进行几个字段的模糊查询.
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
/**
* @author:
* 创建时间:2022/1/11 21:05
*/
public class ESTest_Doc_Query {
public static void main(String[] args) throws Exception {
RestHighLevelClient esClient = null;
// 创建ES客户端
try {
esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("127.0.0.1", 9200, "http"))
);
SearchRequest request = new SearchRequest();
request.indices("user");
// 模糊查询
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.fuzzyQuery("name", "wangwu").fuzziness(Fuzziness.TWO));
request.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
// 查询命中的信息
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits());
System.out.println(response.getTook());
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
} finally {
if (esClient != null) {
// 关闭ES客户端
esClient.close();
}
}
}
}
运行结果如下 :
{“name”:“wangwu”,“age”:40,“sex”:“男”} {“name”:“wangwu1”,“age”:40,“sex”:“女”} {“name”:“wangwu2”,“age”:50,“sex”:“男”} {“name”:“wangwu3”,“age”:50,“sex”:“男”} {“name”:“wangwu44”,“age”:60,“sex”:“男”}
可以看到查询的结果中, 最多有两个字段模糊匹配. 改如下的代码, 只匹配一个字段模糊查询 builder.query(QueryBuilders.fuzzyQuery("name", "wangwu").fuzziness(Fuzziness.ONE));
查询结果如下 :
{“name”:“wangwu”,“age”:40,“sex”:“男”} {“name”:“wangwu1”,“age”:40,“sex”:“女”} {“name”:“wangwu2”,“age”:50,“sex”:“男”} {“name”:“wangwu3”,“age”:50,“sex”:“男”}
高亮查询HighlightBuilder
进行高亮查询, 并且可以指定高亮的前后缀标签. 查询结果使用hit.getHighlightFields()
进行查询.
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermsQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import java.util.Map;
import java.util.Set;
/**
* @author:
* 创建时间:2022/1/11 21:05
*/
public class ESTest_Doc_Query {
public static void main(String[] args) throws Exception {
RestHighLevelClient esClient = null;
// 创建ES客户端
try {
esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("127.0.0.1", 9200, "http"))
);
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder builder = new SearchSourceBuilder();
// 高亮查询
TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name", "zhangsan");
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("");
highlightBuilder.postTags("");
highlightBuilder.field("name");
builder.highlighter(highlightBuilder);
builder.query(termsQueryBuilder);
request.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
// 查询命中的信息
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits());
System.out.println(response.getTook());
for (SearchHit hit : hits) {
Map highlightFields = hit.getHighlightFields();
Set strings = highlightFields.keySet();
for (String key : strings) {
System.out.println("key: " + key + " value: " + highlightFields.get(key));
}
}
} finally {
if (esClient != null) {
// 关闭ES客户端
esClient.close();
}
}
}
}
打印信息如下 :
1 hits 2ms key: name value: [name], fragments[[zhangsan]]
说明成功进行了命中结果的高亮