文章目录



  • 1 term&terms查询
  • 1.1 term查询
  • 1.2 terms查询
  • 2 match查询
  • 2.1 match_all查询
  • 2.2 match查询
  • 2.3 布尔match查询
  • 2.4 multi_match查询
  • 3 其它查询
  • 3.1 id&ids查询
  • 3.2 prefix查询
  • 3.3 fuzzy查询
  • 3.4 wildcard查询
  • 3.5 range查询
  • 3.6 regexp查询


1 term&terms查询

1.1 term查询

term查询代表完全匹配 搜索之前不会对搜索的关键字进行分词
在文档分词库中匹配内容 再查找对应的文档

使用term查询查找province为北京的document

DSL:

POST /index_name/type_name/_search
{
	"form" : 0,
	"size" : 5, // 最多展示条数
	"query" : {
		"term" : {
			"province" : {
				"value" : "北京"
			}
		}
	}
}

Java:

@Test
    public void termQuery() throws IOException {
        // 创建查询request对象
        SearchRequest request = new SearchRequest(index);
        request.types(type);

        // 指定查询条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.from(0);
        builder.size(5);
        builder.query(QueryBuilders.termQuery("province", "北京"));

        request.source(builder);

        // 执行查询
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 获取_source中的数据 并展示
        for (SearchHit hit : response.getHits().getHits()) {
            Map<String, Object> res = hit.getSourceAsMap();
            System.out.println(res);
        }


    }

1.2 terms查询

terms针对一个字段中有多个值时使用
terms和term都不会对查询的关键字进行分词

使用terms查询province为北京或上海或杭州的document

DSL:

POST /index_name/type_name/_search
{
	"query" : {
		"terms" : {
			"province" : {
				"北京",
				"上海",
				"杭州"
			}
		}
	}
}

Java:

@Test
    public void termsQuery() throws IOException {
        // 创建查询request对象
        SearchRequest request = new SearchRequest(index);
        request.types(type);

        // 指定查询条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.termsQuery("province", "北京", "上海", "杭州"));
        
        request.source(builder);
        
        // 执行查询
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 获取_source中的数据 并展示
        for (SearchHit hit : response.getHits().getHits()) {
            Map<String, Object> res = hit.getSourceAsMap();
            System.out.println(res);
        }

    }

2 match查询

2.1 match_all查询

查询全部内容,不指定任何查询条件

使用match_all查询索引中所有document

DSL:

POST /index_name/type_name/_search
{
	"query" : {
		"match_all" : {}
	}
}

Java:

@Test
    public void matchAllQuery() throws IOException {
        // 创建查询request对象
        SearchRequest request = new SearchRequest(index);
        request.types(type);

        // 指定查询条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.matchAllQuery());
		builder.size(200);
		
        request.source(builder);

        // 执行查询
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 获取_source中的数据 并展示
        for (SearchHit hit : response.getHits().getHits()) {
            Map<String, Object> res = hit.getSourceAsMap();
            System.out.println(res);
        }

    }

当查询到的document太多时,es默认只查询10条
可以通过builder.size(x)来查到x条数据

2.2 match查询

match查询属于较智能的查询方式
会根据查询字段的类型不同 采用不同的查询方式

1,查询的内容是不能分词的内容(keyword)时,match不会将查询内容分词

2,查询的内人是可以被分词的内容(text)时,根据分词器分词查询

3,查询日期或数值时,会将日期数值字符串转换为日期或数值对待

match查询底层就是多个term查询,将多个term查询的结果封装到了一起

使用match查询note中含有"系统设计"关键词的document
此时match会使用分词器分解"系统设计",在倒排索引中寻找符合条件的文档

DSL:

POST /index_name/type_name/_search
{
	"query" : {
		"match" : {
			"note" : "系统设计"
		}
	}
}

Java:

@Test
    public void matchQuery() throws IOException {
        // 创建查询request对象
        SearchRequest request = new SearchRequest(index);
        request.types(type);

        // 指定查询条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.matchQuery("note", "系统设计"));

        request.source(builder);

        // 执行查询
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 获取_source中的数据 并展示
        for (SearchHit hit : response.getHits().getHits()) {
            Map<String, Object> res = hit.getSourceAsMap();
            System.out.println(res);
        }

    }

2.3 布尔match查询

可以在match查询中增加operator来控制查询的范围:

使用match查询note中有"软件"或"硬件"关键字的document

DSL:

POST /index_name/type_name/_search
{
	"query" : {
		"match" : {
			"note" : {
				"query" : "软件 硬件",
				"operator" : "or"
			}
		}
	}
}

Java:

@Test
    public void boolMatchQuery() throws IOException {
        // 创建查询request对象
        SearchRequest request = new SearchRequest(index);
        request.types(type);

        // 指定查询条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.matchQuery("note", "软件 硬件").operator(Operator.OR));

        request.source(builder);

        // 执行查询
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 获取_source中的数据 并展示
        for (SearchHit hit : response.getHits().getHits()) {
            Map<String, Object> res = hit.getSourceAsMap();
            System.out.println(res);
        }

    }

2.4 multi_match查询

match针对一个field做检索
multi_match对多个field做检索

使用multi_match查询province或address中带有关键字北京的document

DSL:

POST /index_name/type_name/_search
{
	"query" : {
		"multi_match" : {
			"query" : "北京",
			"fields" : ["province", "address"]
		}
	}
}

Java:

@Test
    public void multiMatchQuery() throws IOException {
        // 创建查询request对象
        SearchRequest request = new SearchRequest(index);
        request.types(type);

        // 指定查询条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.multiMatchQuery("北京", "province", "address"));

        request.source(builder);

        // 执行查询
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 获取_source中的数据 并展示
        for (SearchHit hit : response.getHits().getHits()) {
            Map<String, Object> res = hit.getSourceAsMap();
            System.out.println(res);
        }

    }

3 其它查询

3.1 id&ids查询

根据id查询一条文档:

DSL:

GET /index_name/type_name/1
查询id为1的document

Java:

@Test
    public void queryById() throws IOException {
        // 创建查询request对象
        GetRequest request = new GetRequest(index, type, "1");
                
        // 执行查询
        GetResponse response = client.get(request, RequestOptions.DEFAULT);

        // 输出结果
        System.out.println(response.getSourceAsMap());
    }

查询多个id的文档:

DSL:

POST /index_name/type_name/_search
{
	"query" : {
		"ids" : {
			"values" : ["1", "2", "3"]
		}
	}
}

Java:

@Test
    public void queryByIds() throws IOException {
        // 创建查询request对象
        SearchRequest request = new SearchRequest(index);
        request.types(type);

        // 指定查询条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.idsQuery().addIds("1", "2", "3"));

        request.source(builder);

        // 执行查询
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 获取_source中的数据 并展示
        for (SearchHit hit : response.getHits().getHits()) {
            Map<String, Object> res = hit.getSourceAsMap();
            System.out.println(res);
        }

    }

3.2 prefix查询

前缀查询,可以通过一个关键字去指定一个Field的前缀,从而查询指定文档

查询以"北京"作为前缀的景点:

DSL:

POST /index_name/type_name/_search
{
	"query" : {
		"prefix" : {
			"attractions" : {
				"value" : "北京";
			}
		}
	}
}

Java:

@Test
    public void queryByPrefix() throws IOException {
        // 创建查询request对象
        SearchRequest request = new SearchRequest(index);
        request.types(type);

        // 指定查询条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.prefixQuery("attractions", "北京"));

        request.source(builder);

        // 执行查询
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 获取_source中的数据 并展示
        for (SearchHit hit : response.getHits().getHits()) {
            Map<String, Object> res = hit.getSourceAsMap();
            System.out.println(res);
        }

    }

3.3 fuzzy查询

模糊查询,输入大概文本,根据输入的内容去匹配
可以有错别字,乱序的情况

采用fuzzy模糊查询带有石家庄关键字的document
即使输入了错别字,也能得到结果,但查询结果并不稳定

DSL:

POST /index_name/type_name/_search
{
	"query" : {
		"fuzzy" : {
			"attractions" : {
				"value" : "石家装",
				"prefix_length" : "2" // 关键字的前两个保证匹配不出错
			}
		}
	}
}

Java:

@Test
    public void queryByFuzzy() throws IOException {
        // 创建查询request对象
        SearchRequest request = new SearchRequest(index);
        request.types(type);

        // 指定查询条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.fuzzyQuery("attractions", "石家装").prefixLength(2));

        request.source(builder);

        // 执行查询
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 获取_source中的数据 并展示
        for (SearchHit hit : response.getHits().getHits()) {
            Map<String, Object> res = hit.getSourceAsMap();
            System.out.println(res);
        }

    }

3.4 wildcard查询

通配查询,可以在查询时 在关键字中指定通配符*和占位符?

DSL:

POST /index_name/type_name/_search
{
	"query" : {
		"wildcard" : {
			"companyName" : {
				"value" : "*中国??"
			}
		}
	}
}

Java:

@Test
    public void queryByWildCard() throws IOException {
        // 创建查询request对象
        SearchRequest request = new SearchRequest(index);
        request.types(type);

        // 指定查询条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.wildcardQuery("companyName", "*中国??"));

        request.source(builder);

        // 执行查询
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 获取_source中的数据 并展示
        for (SearchHit hit : response.getHits().getHits()) {
            Map<String, Object> res = hit.getSourceAsMap();
            System.out.println(res);
        }

    }

3.5 range查询

范围查询,只针对数值类型

查询age在(18, 55]间的document:

DSL:

POST /index_name/type_name/_search
{
	"query" : {
		"range" : {
			"age" : {
				"gt" : "18",
				"lte" : "55"
			}
		}
	}
}

Java:

@Test
    public void queryByRange() throws IOException {
        // 创建查询request对象
        SearchRequest request = new SearchRequest(index);
        request.types(type);

        // 指定查询条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.rangeQuery("age").lte(55).gt(18));

        request.source(builder);

        // 执行查询
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 获取_source中的数据 并展示
        for (SearchHit hit : response.getHits().getHits()) {
            Map<String, Object> res = hit.getSourceAsMap();
            System.out.println(res);
        }

    }

3.6 regexp查询

正则查询 通过编写的正则表达式查询文档

查询手机号以180开头,8结尾的文档:

DSL:

POST /index_name/type_name/_search
{
	"query" : {
		"regexp" : {
			"mobile" : "180[0-9]{8}"
		}
	}
}

Java:

@Test
    public void queryByRegexp() throws IOException {
        // 创建查询request对象
        SearchRequest request = new SearchRequest(index);
        request.types(type);

        // 指定查询条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.regexpQuery("mobile", "138[0-9]{8}"));

        request.source(builder);

        // 执行查询
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 获取_source中的数据 并展示
        for (SearchHit hit : response.getHits().getHits()) {
            Map<String, Object> res = hit.getSourceAsMap();
            System.out.println(res);
        }

    }