文章目录
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);
}
}