模糊查询
- wildcard查询:通配符查询,?(任意单个字符),*(0个或多个字符);会进行分词
- regexp查询:正则查询
- prefix查询:前缀查询
一、通配符查询(wildcard)
GET goods/_search
{
"query": {
"wildcard": {
"title": {
"value": "title?"
}
}
}
}
GET goods/_search
{
"query": {
"wildcard": {
"title": {
"value": "tit*"
}
}
}
}
注意前面不要用通配符,因为这样会进行全部的倒排索引扫描,类似于mysql的全表扫描,所以性能不高。
/**
* 模糊查询:wildcardQuery
*/
@Test
public void testWildcardQuery() throws IOException {
SearchRequest searchRequest = new SearchRequest("goods");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
QueryBuilder wildcardQuery = QueryBuilders.wildcardQuery("title", "tit*");
sourceBuilder.query(wildcardQuery);
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
long value = searchHits.getTotalHits().value;
System.out.println("总记录数:" + value);
SearchHit[] hits = searchHits.getHits();
List<Goods> goodsList = new ArrayList<>();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
Goods goods = JSON.parseObject(sourceAsString, Goods.class);
goodsList.add(goods);
}
goodsList.forEach(c -> System.out.println(JSON.toJSONString(c)));
}
二、正则查询(regexp)
GET goods/_search
{
"query": {
"regexp": {
"title": "\\tit+(.)*"
}
}
}
三、前缀查询(prefix)
GET goods/_search
{
"query": {
"prefix": {
"title": "tit"
}
}
}