1.导入测试数据
为了测试搜索功能,我们首先导入此前PD商城的测试数据,一共有3160条商品数据,数据样例如下:
{ "index": {"_index": "pditems", "_id": "536563"}}
{ "id":"536563","brand":"联想","title":"联想(Lenovo)小新Air13 Pro 13.3英寸14.8mm超轻薄笔记本电脑","sell_point":"清仓!仅北京,武汉仓有货!","price":"6688.0","barcode":"","image":"/images/server/images/portal/air13/little4.jpg","cid":"163","status":"1","created":"2015-03-08 21:33:18","updated":"2015-04-11 20:38:38"}
1.1 下载测试数据
我们首先需要将数据库中的数据导出成json格式的数据,可以直接使用本地已经导出的数据:
将在代码仓库中拉取下载的 pditems.json
上传到服务器;
1.2 创建索引和映射
使用Elastic提交相关索引和映射创建的数据:
PUT /pditems
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
},
"mappings": {
"properties": {
"id": {
"type": "long"
},
"brand": {
"type": "text",
"analyzer": "ik_smart"
},
"title": {
"type": "text",
"analyzer": "ik_max_word"
},
"sell_point": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
},
"price": {
"type": "float"
},
"image": {
"type": "keyword"
},
"cid": {
"type": "long"
},
"status": {
"type": "byte"
},
"created": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
},
"updated": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
}
}
用 head 查看索引:
1.3 导入数据
在服务器上,进入 pditems.json
所在的文件夹,执行批量数据导入:
curl -XPOST 'localhost:9200/pditems/_bulk' \
-H 'Content-Type:application/json' \
--data-binary @pditems.json
正常情况下,执行完成后,都是成功的,没有失败的,表明数据已全部导入
1.4 查看数据
搜索 pditems
索引中全部 3160 条数据:
GET /pditems/_search
{
"query": {
"match_all": {}
},
"size": 3160
}
也可以在head插件中查看:
2.搜索文档
2.1 搜索所有数据
# 搜索 pditems 索引中全部数据
POST /pditems/_search
{
"query": {
"match_all": {}
}
}
虽然我们查询了全部数据,但实际只显示了10条数据,获取更多数据需要添加size
参数,值为多少,那么获取多少数据:
# 搜索 pditems 索引中全部数据
POST /pditems/_search
{
"query": {
"match_all": {}
},
"size":1
}
2.2 关键词搜索
# 查询 pditems 索引中title中包含"电脑"的商品
POST /pditems/_search
{
"query": {
"match": {
"title": "电脑"
}
}
}
2.3 搜索结果过滤器
must
指必须满足的条件,确定条件title
为电脑;filter
指范围条件,get
指大于等于多少,let
指小于等于多少;
# 价格大于2000,并且title中包含"电脑"的商品
POST /pditems/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"title": "电脑"
}
}
],
"filter": [
{
"range": {
"price": {
"gte": "2000"
}
}
}
]
}
}
}
2.4 搜索结果高亮显示
multi_match
关键字指多字段搜索
POST /pditems/_search
{
"query": {
"multi_match":{
"query": "手机",
"fields": ["title", "sell_point"]
}
},
"highlight" : {
"pre_tags" : ["<i class=\"highlight\">"],
"post_tags" : ["</i>"],
"fields" : {
"title" : {},
"sell_point" : {
"pre_tags": "<em>",
"post_tags": "</em>"
}
}
}
}