查询某个字段的值不等于空字符串
GET aunt/aunt_type/_search
{
"query": {
"bool": {
"must_not": [
{
"term": {
"auntUserId": {
"value": ""
}
}
}
]
}
}
}
反向查询(must_not)
GET /test2/product/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"age": 20
}
}
,{
"match": {
"name": "test11"
}
}
]
}
}
}
字段排序查询
GET /test2/product/_search
{
"query": {
"match": {
"name": "test"
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
分页排序查询
GET /test2/product/_search
{
"query": {
"match": {
"name": "test"
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
],
#从第几条开始
"from": 0,
#获取几条数据
"size": 2
#from + size其实就是limit from,size
}
or多条件查询,是否存在(返回boolean值)
GET /test2/product/_search
{
"query": {
"bool": {
#must的两个条件都必须满足,即mysql中的and
#should的两个条件至少满足一个就可以。即mysql中的or
"must": [
{
"match": {
"name": "test"
}
},
{
"match": {
"age": 20
}
}
]
}
}
}
条件过滤(范围查询)
GET /test2/product/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "test"
}
}
],
"filter": {
"range": {
"age": {
#gte >=
#lte <=
#lt <
#gt >
"gte": 10,
"lte": 19
}
}
}
}
}
}
某字段多值查询(in查询)
多个值需要空格分隔
GET /test2/product/_search
{
"query": {
"match": {
"name": "test 111111"
}
}
}
基于Java 代码查询
| matchAllQuery | 匹配所有文档 |
|---|---|
| queryStringQuery | 基于Lucene的字段检索 |
| wildcardQuery | 通配符查询匹配多个字符,?匹配1个字符* |
| termQuery | 词条查询 |
| matchQuery | 字段查询 |
| idsQuery | 标识符查询 |
| fuzzyQuery | 文档相似度查询 |
| includeLower includeUpper | 范围查询 |
| boolQuery | 组合查询(复杂查询) |
| SortOrder | 排序查询 |
'
1 查询所有matchAllQuery()匹配所有文件
match_all查询是Elasticsearch中最简单的查询之一。它使我们能够匹配索引中的所有文件。
@Test
public void searchAll(){
SearchResponse searchResponse = client.prepareSearch("sanguo")
.setTypes("dahan").setQuery(QueryBuilders.matchAllQuery())
.get();
// 获取命中次数,查询结果有多少对象
SearchHits hits = searchResponse.getHits();
System.out.println("查询结果" + hits.getTotalHits() + "条");
Iterator iterator = hits.iterator();
while (iterator.hasNext()) {
SearchHit next = iterator.next();
System.out.println("===============================================");
}
}
2 解析查询字符串
相比其他可用的查询,query_string查询支持全部的Apache Lucene查询语法
针对多字段的query_string查询
@Test
public void query_String(){
SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
.setQuery(QueryBuilders.queryStringQuery("孙尚香")).get();
SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
Iterator iterator = hits.iterator();
while (iterator.hasNext()) {
SearchHit next = iterator.next();
System.out.println("===============================================");
}
}
3 通配符查询(wildcardQuery)
*匹配多个字符,?匹配1个字符
注意:避免* 开始, 会检索大量内容造成效率缓慢
@Test
public void wildcardQuery(){
SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
.setQuery(QueryBuilders.wildcardQuery("address", "广东*")).get();
SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
Iterator iterator = hits.iterator();
while (iterator.hasNext()) {
SearchHit next = iterator.next();
System.out.println("===============================================");
}
}
4 词条查询(termQuery)
词条查询是Elasticsearch中的一个简单查询。它仅匹配在给定字段中含有该词条的文档,而且是确切的、未经分析的词条
termQuery("key", obj) 完全匹配
termsQuery("key", obj1, obj2..)
一次匹配多个值,有一个值是正确的,就可以查询出数据
@Test
public void termQuery(){
SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
.setQuery(QueryBuilders.termsQuery("name", "张飞","刘备","关羽")).get();
// 获取命中次数,查询结果有多少对象
SearchHits hits = searchResponse.getHits();
Iterator iterator = hits.iterator();
while (iterator.hasNext()) {
SearchHit next = iterator.next();
System.out.println("===============================================");
}
}
5 字段匹配查询
match**查询把query参数中的值拿出来,加以分析,然后构建相应的查询**。使用match查询时,Elasticsearch将对一个字段选择合适的分析器,所以可以确定,传给match查询的词条将被建立索引时相同的分析器处理。
@Test
public void MatchQuery(){
SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
.setQuery(QueryBuilders.matchQuery("address", " 上海")).get();
SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
System.out.println("查询结果有:" + hits.getTotalHits() + "条");
Iterator iterator = hits.iterator();
while (iterator.hasNext()) {
SearchHit next = iterator.next();
System.out.println("===============================================");
}
}
Matchquery 和termquery的区别:
match:匹配的时候,会将查询的关键字进行分词,然后根据分词后的结果进行查询。 term:直接使用关键字进行查询,不对关键字进行分词。
multiMatchQuery("text", "field1", "field2"..); 匹配多个字段
mutilMatchQuery:
@Test
public void mutileMatchQuery(){
SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
.setQuery(QueryBuilders.multiMatchQuery("北京", "address","name")).get();
// 获取命中次数,查询结果有多少对象
SearchHits hits = searchResponse.getHits();
Iterator iterator = hits.iterator();
while (iterator.hasNext()) {
SearchHit next = iterator.next();
System.out.println("===============================================");
}
}
6 只查询ID(标识符查询)
标识符查询是一个简单的查询,仅用提供的标识符来过滤返回的文档。
@Test
public void idsQuery() {
SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
.setQuery(QueryBuilders.idsQuery().addIds("AWNkQSCJzU0_wTuf7egi")).get();
SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
Iterator iterator = hits.iterator();
while (iterator.hasNext()) {
SearchHit next = iterator.next();
System.out.println("===============================================");
}
}
7 相似度查询
插入两条测试数据:
PUT /tt1/doc1/123
{
"name": "曹操",
"male" : "男",
"age" : 40 ,
"birthday" : "1975-02-03" ,
"classNo" : 1 ,
"address" : "海淀区坐落于北京市" ,
"isLeader" : true
}
PUT /tt1/doc1/234
{
"name": "董卓",
"male" : "男",
"age" : 35 ,
"birthday" : "1975-02-03" ,
"classNo" : 1 ,
"address" : "北京it程序员" ,
"isLeader" : true
}
fuzzy查询是模糊查询中的第三种类型,它基于编辑距离算法来匹配文档
@Test
public void fuzzyQuery(){
SearchResponse searchResponse = client.prepareSearch("tt1").setTypes("doc1")
.setQuery(QueryBuilders.fuzzyQuery("address", "北京市")).get();
SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
System.out.println("查询结果有:" + hits.getTotalHits() + "条");
Iterator iterator = hits.iterator();
while (iterator.hasNext()) {
SearchHit next = iterator.next();
System.out.println("===============================================");
}
}
8 范围查询
范围查询使我们能够找到在某一字段值在某个范围里的文档,字段可以是数值型,也可以是
基于字符串的
includeLower(true):包含上界
IncludeUpper(true):包含下界
@Test
public void rangeQuery(){
SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
.setQuery(QueryBuilders.rangeQuery("age").from(18).to(22)
.includeLower(true)
.includeUpper(false))
.get();
SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
Iterator iterator = hits.iterator();
while (iterator.hasNext()) {
SearchHit next = iterator.next();
System.out.println("===============================================");
}
}
9 组合查询(复杂查询)must(QueryBuilders) : AND mustNot(QueryBuilders): NOT should(QueryBuilders):OR
插入一条数据:
PUT /tt1/doc1/345
{
"name": "貂蝉",
"male" : "女",
"age" : 16 ,
"birthday" : "2000-02-03" ,
"classNo" : 1 ,
"address" : "北京市女it程序员" ,
"isLeader" : true
}
@Test
public void boolQuery(){
SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
.setQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("address", "程序员"))
.must(QueryBuilders.termQuery("male", "女"))).get();
SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
Iterator iterator = hits.iterator();
while (iterator.hasNext()) {
SearchHit next = iterator.next();
System.out.println("===============================================");
}
}
10 排序查询
@Test
public void SortOrderQuery(){
SearchResponse searchResponse = client.prepareSearch("sanguo").setTypes("dahan")
.setQuery(QueryBuilders.matchAllQuery())
.addSort("age", SortOrder.ASC).get();
SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
Iterator iterator = hits.iterator();
while (iterator.hasNext()) {
SearchHit next = iterator.next();
System.out.println("===============================================");
}
}



