实战 | Elasticsearch实现类Google高级检索
2017-12-21 14:04
302 查看
少废话,说正事。
通过高级搜索配置搜索项,能更准确的过滤掉不相干信息,获取最想要的检索信息。
以Google搜索为例(截取核心片段):
需要分词处理;
若需要指定字段,则使用matchQuery实现;
若无需指定字段的全文检索,则使用queryStringQuery实现;
需要完整匹配字符,使用wildcardQuery结合”*”实现;
空格分隔每个关键词,需要将多个词空格拆分,然后对每个关键词通过should结合wildcardQuery遍历实现;
包含以下全部关键词的反面,
若需要指定字段,则使用must_not结合matchQuery实现;
若无需指定字段,则使用must_not结合queryStringQuery实现;
限定搜索的开始和结束时间,通过rangequery实现。
根据关键词位置的不同,采用不同的实现;
关键词位于title字段:指定title进行检索;
关键词位于content字段:指定content进行检索;
关键词位于全部字段:不指定字段进行检索,多使用 queryStringQuery实现。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
以上DSL对应如下:
Elasticsearch检索中的精确匹配、全文检索分为很多种,需要结合开发需求进行因地制宜的使用。
一、高级检索的功能点
通过高级搜索配置搜索项,能更准确的过滤掉不相干信息,获取最想要的检索信息。 以Google搜索为例(截取核心片段):
二、高级检索拆分
1、包含以下全部的关键词:
需要分词处理; 若需要指定字段,则使用matchQuery实现;
若无需指定字段的全文检索,则使用queryStringQuery实现;
2、包含以下的完整关键词 :
需要完整匹配字符,使用wildcardQuery结合”*”实现;
3、包含以下任意一个关键词 :
空格分隔每个关键词,需要将多个词空格拆分,然后对每个关键词通过should结合wildcardQuery遍历实现;
4、不包括以下关键词 :
包含以下全部关键词的反面, 若需要指定字段,则使用must_not结合matchQuery实现;
若无需指定字段,则使用must_not结合queryStringQuery实现;
5、限定要搜索的网页的时间是:
限定搜索的开始和结束时间,通过rangequery实现。
6、关键词位置:
根据关键词位置的不同,采用不同的实现; 关键词位于title字段:指定title进行检索;
关键词位于content字段:指定content进行检索;
关键词位于全部字段:不指定字段进行检索,多使用 queryStringQuery实现。
三、DSL高级检索实现
POST detail_index/_search { "from" : 0, "size" : 10, "query" : { "bool" : { "must" : [ { "match" : { "title" : { "query" : "苹果乔布斯", "operator" : "OR", "prefix_length" : 0, "max_expansions" : 50, "fuzzy_transpositions" : true, "lenient" : false, "zero_terms_query" : "NONE", "boost" : 1.0 } } }, { "wildcard" : { "title.keyword" : { "wildcard" : "*苹果总裁库克*", "boost" : 1.0 } } }, { "range" : { "public_time" : { "from" : "2017-09-07 00:00:00", "to" : "2017-09-15 23:59:59", "include_lower" : true, "include_upper" : true, "boost" : 1.0 } } } ], "must_not" : [ { "wildcard" : { "title.keyword" : { "wildcard" : "*苹果梨*", "boost" : 1.0 } } } ], "should" : [ { "wildcard" : { "title.keyword" : { "wildcard" : "*苹果手机*", "boost" : 1.0 } } }, { "wildcard" : { "title.keyword" : { "wildcard" : "*iphoneX*", "boost" : 1.0 } } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 } }, "_source" : { "includes" : [ "title", "content" ], "excludes" : [ ] }, "highlight" : { "pre_tags" : [ "<span style=\"color:red\">" ], "post_tags" : [ "</span>" ], "fragment_size" : 100, "number_of_fragments" : 5, "require_field_match" : true, "fields" : { "title" : { } } } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
以上DSL对应如下:
四、小结
Elasticsearch检索中的精确匹配、全文检索分为很多种,需要结合开发需求进行因地制宜的使用。
相关文章推荐
- 实战 | Elasticsearch实现类Google高级检索
- Go实战--golang中使用gRPC和Protobuf实现高性能api(golang/protobuf、google.golang.org/grpc)
- Tensorflow实战学习(三十二)【实现Google Inception Net】
- TensorFlow:实战Google深度学习框架(二)实现简单神经网络
- Shell脚本实现检测某ip网络畅通情况,实战用例
- 【项目实战】——Java根据奖品权重计算中奖概率实现抽奖(适用于砸金蛋、大转盘等抽奖活动)
- C++ 实现 google搜索提示
- Google日历中可以导入外部的ical数据实现免费发送天气预报
- Java Socket实战之六 使用NIO包实现Socket通信
- TensorFlow:实战Google深度学习框架(六)图像数据处理
- Pinterest谈实战经验:如何在两年内实现零到数百亿的月访问
- Elasticsearch实现原理分析-2
- 利用google对特定站点进行测试的实现
- 网络层架构设计与实战十六https功能设计与实现
- Google Protobuf——实现跨平台跨语言的序列化/反序列化
- Jetty实战之 嵌入式运行Jetty实现简单文件服务器
- Android BitmapShader 实战 实现圆形、圆角图片
- 深度学习Caffe实战笔记(17)MATLAB实现卷积层卷积核权重的可视化
- c#实现google样式的分页