2.1、term&terms
查问
2.1.1、term 查问
参考: Elasticsearch Reference [7.10] » Query DSL » Term-level queries » Term query
term 的查问是代表 齐全匹配 ,搜寻之前不会对你搜寻的关键字进行 分词 ,如关键字手机,不会分成手和机;再依据关键字去文档分词库中去匹配内容。
相似于 MySQL 库的 where province =?
2.1.1.1、命令
# from size 相似于 mysql 的 limit
POST /sms-logs-index/_search
{
"from": 0,
"size": 10,
"query": {
"term": {
"province": {"value": "北京"}
}
}
}
2.1.1.2、java 代码
@Test
public void termQuery() throws IOException {
//1。创立 request 对象,查问用的对象个别都是 SearchRequest 对象
SearchRequest mySearchRequest = new SearchRequest(index);
//2,指定查问条件,依赖查问条件的对象 SearchSourceBuilder 的对象
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.from(0).size(10).query(QueryBuilders.termQuery("province", "北京")); // 指定 term 查新条件
mySearchRequest.source(builder);
//3. 执行查问
SearchResponse search = client.search(mySearchRequest, RequestOptions.DEFAULT);
//4. 获取到_source 中的数据,并展现
// 留神 RESTFUL 格调上是两个 hits,所以这里要两次 getHits()
for (SearchHit hit : search.getHits().getHits()) {Map<String, Object> result = hit.getSourceAsMap();
System.out.println(result);
}
}
2.1.2、terms 查问
terms 和 terms 的查问机制是一样的,都不会将指定的查问关键字进行分词,间接去分词库中匹配,找到相应的文档内容。
terms:是针对一个字段蕴含多个值时应用。
换句话说:
- term 相似于 MySQL 的 where province=?
- terms 相似于 MySQL 中的 where province in (?, ? ,?)
留神:term 和 terms 只是说不会对关键字进行分词,并不是说只能用于 keyword 类型的字段查问,如假如文档中有个字段是 text 类型,采纳了 ik 分词器,外面的值是奋斗的时代,通过网上在线 ik 分词器,咱们晓得会分解成奋斗,奋,斗,时代,如图 4,然而如果你用该字段的 term 或者 terms 查问,输出的关键字是奋斗的时代,因为输出的关键字不会分词,反而查不到该记录,如果你输出的关键字是奋斗就是能够的。
2.1.2.1、命令
POST /sms-logs-index/_search
{
"from": 0,
"size": 20,
"query": {
"terms": {
"province": [
"北京",
"上海",
"杭州"
]
}
}
}
2.1.2.2、java 代码
@Test
public void termsQuery() throws IOException {
//1。创立 request 对象,查问用的对象个别都是 SearchRequest 对象
SearchRequest mySearchRequest = new SearchRequest(index);
//2,指定查问条件,依赖查问条件的对象 SearchSourceBuilder 的对象
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.from(0).size(10).query(QueryBuilders.termsQuery("province", "北京", "上海", "杭州")); // 指定 term 查新条件
// 留神将条件放入 Request 对象中
mySearchRequest.source(builder);
//3. 执行查问
SearchResponse search = client.search(mySearchRequest, RequestOptions.DEFAULT);
//4. 获取到_source 中的数据,并展现
// 留神 RESTFUL 格调上是两个 hits,所以这里要两次 getHits()
for (SearchHit hit : search.getHits().getHits()) {Map<String, Object> result = hit.getSourceAsMap();
System.out.println(result);
}
}