创建单元测试
@SpringBootTest(classes = SearchApplication.class)
@RunWith(SpringRunner.class)
public class Test2 {
@Autowired
RestHighLevelClient client;
@Autowired
RestClient restClient;
}
搜索全部 matchAllQuery
//搜索全部matchAllQuery
@Test
public void test01() throws IOException {
//搜索请求对象
SearchRequest searchRequest = new SearchRequest("索引库名称"); searchRequest.types("类型名称");
//搜索源对象 matchAllQuery 搜索全部
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//指定为matchAllQuery
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
//source源字段过虑 第一个需要搜索的字符串数组,第二个需要过滤的字符串数组
searchSourceBuilder.fetchSource(new String[]{"映射字段名","映射字段名"}, new String[]{});
//向搜索请求对象中设置搜索源对象
searchRequest.source(searchSourceBuilder);
//搜索结果
SearchResponse search = client.search(searchRequest);
SearchHits hits = search.getHits();
System.out.println("搜索结果数量为---"+hits.getTotalHits());
//得到匹配度高的文档
SearchHit[] hits1 = hits.getHits();
for (SearchHit documentFields : hits1) {
Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();
System.out.println(sourceAsMap.get("映射字段名"));
}
}
分页查询 与mysql limit 类似
//在客户端请求 获取搜索结果前添加
searchSourceBuilder.from(当前记录起始位置);
searchSourceBuilder.size(每页显示记录数);
搜索时不对查询条件进行分词 termQuery
//在搜索源对象中 设置termQuery
searchSourceBuilder.query(QueryBuilders. termQuery("映射字段名","查询条件"));
搜索时对查询条件分词 matchQuery
//在搜索源对象中 设置matchQuery
QueryBuilders.
matchQuery("映射字段名","查询条件").
//operator(Operator.OR) //OR 匹配一个词就行,AND 都需要匹配
minimumShouldMatch("30%") //分词后*80% 向上取整 例2*80% = 1 文章满足1个词即可
搜索时对查询条件分词 匹配多个字段 multiMatchQuery
//在搜索源对象中 设置matchQuery
QueryBuilders.
multiMatchQuery("查询条件","映射字段名","映射字段名").
//operator(Operator.OR) //OR 匹配一个词就行,AND 都需要匹配
minimumShouldMatch("80%").
//提高权重 当关键词在指定映射字段中出现时,匹配分值提高10倍
field("指定映射字段名",10)
布尔查询 可以将上述多个条件结合
//查询条件 1
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.
multiMatchQuery("查询条件","映射字段名","映射字段名").
minimumShouldMatch("80%").
//提高权重 当关键词在name中出现时,提高10倍
field("description", 10);
//查询条件 2
TermQueryBuilder termQueryBuilder = QueryBuilders. termQuery("映射字段名","查询条件");
//布尔查询
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
//must:表示必须,多个查询条件必须都满足。(通常使用must)
//should:表示或者,多个查询条件只要有一个满足即可
//must_not:表示非
boolQueryBuilder.must(multiMatchQueryBuilder);
searchSourceBuilder.query(boolQueryBuilder);
过滤器 对查询结果进行过滤
//过滤器 不计算得分 效率要比查询高
//查询条件
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.
multiMatchQuery("spring css", "description").
minimumShouldMatch("80%").
//提高权重 当关键词在name中出现时,提高10倍
field("description", 10);
//布尔查询
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
boolQueryBuilder.must(multiMatchQueryBuilder);
boolQueryBuilder.filter(QueryBuilders.termQuery("映射字段名","查询条件"));
searchSourceBuilder.query(boolQueryBuilder);
对查询结果高亮显示
//创建高亮对象
HighlightBuilder highlightBuilder = new HighlightBuilder();
//根据需求添加前端高亮标签
highlightBuilder.preTags("<tag>"); //前缀
highlightBuilder.postTags("<tag>"); //后缀
highlightBuilder.field("高亮映射字段");
//在搜索源中设置高亮对象
searchSourceBuilder.highlighter(highlightBuilder);
//高亮取值
//搜索结果
SearchResponse search = client.search(searchRequest);
SearchHits hits = search.getHits();
SearchHit[] hits1 = hits.getHits();
for (SearchHit documentFields : hits1) {
//获取高亮内容
Map<String, HighlightField> highlightFields = documentFields.getHighlightFields();
HighlightField name = highlightFields.get("高亮映射字段");
Text[] fragments = name.getFragments();
StringBuilder stringBuilder = new StringBuilder();
for (Text fragment : fragments) {
stringBuilder.append(fragment);
}
System.out.println("课程名称----"+stringBuilder.toString());
}