上QQ阅读APP看书,第一时间看更新
1.6 实例
参考文献[Open,2014b],本节给出创建数据索引、构建映像、录入信息、构建检索表达式、返回检索结果等比较全面的信息检索过程。在得出检索结果后,可将得到的检索结果发送到页面前端,通过相应的UI渲染后,就能得到类似普通搜索引擎那样的结果了。为方便看到中间结果,下面的例子仍是借助Head插件实现的。
第一步,创建示例索引文件test,注意用PUT方法实现,如图1.16所示。
图1.16 创建示例索引文件test
第二步,创建数据映像文件,主要代码如代码段1.4所示,处理结果如图1.17所示。注意,在建立索引和检索时使用的分析器应该是一样的,例子中采用的是IK分析器。
图1.17 创建映像Mapping
:为使书中表述风格统一,在下面代码中参照C语言的注释方式增加了注释,但这种注释风格在Head和实际应用环境中是不允许的,这里只是为了方便说明而已。
//代码段1.4: 创建数据Mapping
{
"news": { //建立news的Type
"properties": { //下面是定义各个字段
"content": { //对content字段的结构设计
"type": "string", //当前字段为字符串类型
"store": "no", //当前字段不存储
"term_analyzer": "with_positions_offsets", //指示不仅保存分割后的词 还保存词之间的距离
"index_analyzer": "ik_max_word", //设定索引时用的分词器是IK分析器
"search_analyzer": "ik_max_word" //设定搜索该字段时用的分词器是IK分析器
},
"title": { //对title字段的结构设计
"type": "string",
"store": "no",
"term_analyzer": "with_positions_offsets",
"index_analyzer": "ik_max_word",
"search_analyzer": "ik_max_word",
"boost": 5
},
"author": { //对author字段的结构设计
"type": "string",
"index": "not_analyzed" //设定该字段为不分词
},
"publish_date": { //对publish_date字段的结构设计
"type": "date",
"format": "yyyy/mm/dd" //设定该日期字段的格式
},
"category": { //对category字段的结构设计
"type": "string",
"index": "not_analyzed"
}
}
}
}
第三步,录入数据信息。可以在Head中采用如图1.18所示的方法添加数据。添加数据后,可以在Head中看到数据情况,如图1.19所示。
图1.18 添加数据
图1.19 查看添加好的索引数据
第四步,构建检索表达式,其内容可包括如下几个主要部分:
(1)分页(from/size)。
(2)字段(fields)。
(3)排序(sort)。
(4)查询(query)。
(5)过滤(filter)。
(6)高亮(highlight)。
(7)统计(facets)。
有关构造检索的示例代码详见代码段1.5(对其中部分代码含义的解释可参阅第3章),检索结果如图1.20所示。
图1.20 检索结果
//代码段1.5: 构建检索表达式
{
"from": 0, //检索结果集合的起始位置
"size": 10, //返回的检索结果数量
"fields": [ //指定检索结果document集合中含有哪些域
"title",
"content",
"publish_date",
"category",
"author"
],
"sort": [ //定义排序方式
{
"publish_date": { //搜索结果按照publish_date进行排序
"order": "asc" //按正序排序,即从小到大
}
},
"_score" //先按照publish_date,再按照_score排序
],
"query": {
"bool": { //构建布尔查询
"should": [
{
"term": {
"title": "中国"
}
},
{
"term": {
"content": "中国"
}
}
]
}
},
"filter": { //创建过滤规则
"range": { //按照区间进行过滤
"publish_date": {
"from": "2014/01/01", //起始时间
"to": "2014/12/31", //结束时间
"include_lower": true,
"include_upper": false
}
}
},
"highlight": { //对高亮进行相关设置
"pre_tags": [ //高亮的前置标签
"<tag1>",
"<tag2>"
],
"post_tags": [ //高亮的后置标签
"</tag1>",
"</tag2>"
],
"fields": { //需高亮的域
"title": {},
"content": {}
}
},
"facets": { //构建聚合
"cate": {
"terms": {
"field": "category"
}
}
}
}