开发者学堂课程【ElasticSearch 入门精讲:regexpQuery】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/631/detail/10007
regexpQuery
内容介绍:
一、前言
二、演示
一、前言
假设现在你想匹配在 W 地域 (Area) 的所有邮政编码,那我们怎样来匹配呢?
regexp 匹配
curl-XGET ‘http://localhost:9200/my_index/address/_search -d’
{
query”: {
regexp”: {
“postcode”: “W[0-9].+”
}
}
}
这个正则表达式规定了词条需要以 W 开头,紧跟着一个0到9的数字,然后是一个或者多个其它字符。
Regexp 所要匹配的字段要以正则式的形式出现,如以上代码中 “W[0-9].+”。
——————————
正则表达式查询
responsebuilder.setQuery(QueryBuilders.regexpQuery(field, regexp))
/**
*高亮显示查询
*获取数据
*查询 apache,不仅在 author 拥有,也可以在 url,在 name 中也可能拥有
*author or url --->booleanQuery中的 should 操作
* 如果是 and 的类型--->booleanQuery 中的 must 操作
* 如果是 not 的类型--->booleanQuery 中的 mustNot 操作
*使用的 match 操作,其实就是使用要查询的 keyword 和对应
字段进行完整匹配,是否相等,相等返回
*/
@Test
public void testSearch4() {
SearchResponseresponse= client.prepareSearch(indics).setSearchTyp
e(SearchType.DEFAULT)
//.setQuery(QueryBuilders.multiMatchQuery("apache", "author" , "url"))
//.setQuery(QueryBuilders.regexpQuery("url", ".*apache.*"))
// .setQuery(QueryBuilders.termQuery( "author", "apache"))
.setQuery(QueryBuilders.boolQuery()
.should(QueryBuilders.regexpQuery("url",".*apache.*"))
.should(QueryBuilders.termQuery("autbor", "apache")))
//设置高亮显示--->设置相应的前置标签和后置标签
.setHighlighterPreTags("<span color= ‘blue’ size= ‘18px’>")
.setHighlighterPostTags("</span>")
//哪个字段要求高亮显示
.addHighlightedField("author")
.addHighlightedField("url")
.get();
SearchHits searchHits = response.getHits():
float maxScore = searchHits.getMaxScore(); //查询结果中的最大文档得分
System.out.println("maxScore: " + maxScore);
long totalHits = searchHits.getTotalHits(); //查询结果记录条数
System.out.println("totalHits:" + totalHits);
SearchHit[] hits = searchHits.getHits(); //查询结果
System.out.println("当前返回结果记录条数:” + hits.length);
for(SearchHit hit : hits) {
System.out.println(" ========================================================");
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
for(Map.Entry<String , HighlightField> me : highlightFields.entrySet()) {
System.out.println("--------------------------------------");
String key = me.getKey();
HighlightField highlightField = me.getValue();
String name = highlightField.getName();
System.out.println("key: " + key + ", name:" + name);
Text[] texts = highlightField.fragments();
String value = "";
for(Text text : texts){
//System.out.println("text: " + text.toString());
value += text.toString();
}
System.out.println("value:" + value);
}
}
}
二、演示
在 TestES.java 中输入:
/**
*regexpQuery 演示
*案例:
查询索引库之 bigdata 下的 type 之 product 下 name 字段值
中包含有 oo 的索引信息。(使用 regexpQuery 的形式实现)
*/
@Test
public void testRegexpQuery(){
//正则表达式
String regex = ".+oo.+";
//查询
SearchResponse response = client.prepareSearch(INDEX)
.setTypes(TYPE).setQuery(QueryBuilders.regexpQuery(name:"name",regex))
.get();
//显示检索到的信息
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}
运行看是否能查询到带 oo 的
结果显示
{“author”: “杰克逊”, “last_version”: “2.1.0”, “name”: “sqoop”}
{“author”: “施瓦辛格”,“name”: “hadoop”, “version”: “3.1.2”}