电商搜索实战一 索引构建示例
索引定义思路
- 定义字段, 就是说有哪些字段需要保存到es中。
- 定义字段类型,哪些字段做分词,哪些字段做排序还有一些像地理信息等复杂类型的定义。
- 定义字段的分词器
创建索引
PUT /shop
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"id":{ "type": "integer"},
"name":{"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},
"tags":{"type": "text","analyzer": "whitespace","fielddata": true},
"location":{"type": "geo_point"},
"remark_score":{"type": "double"},
"price_per_man":{"type": "integer"},
"category_id": {"type": "integer"},
"category_name":{ "type": "keyword"},
"seller_id":{"type":"integer"},
"seller_remark_score":{"type": "double"},
"seller_disabled_flag":{"type": "integer"}
}
}
}
索引解释
-
“name”:{“type”: “text”,“analyzer”: “ik_max_word”,“search_analyzer”: “ik_smart”},
店铺名称 -
“tags”:{“type”: “text”,“analyzer”: “whitespace”,“fielddata”: true}, 标签: 如环境好, 帅哥多, 等
fielddata: true 意思为聚合操作, 这里是为了可以让es支持聚合统计.
“analyzer”: “whitespace” 按照空格分词 -
“type”: “geo_point”: 意思为基于地理信息的分词
-
“remark_score”:{“type”: “double”} 是门店评分字段,这里使用double 类型比较合适.用于排序的字段.
-
“price_per_man”:{“type”: “integer”} 人均价格字段,可以排序, 可以取最高,最低等等操作.
-
“category_id”: {“type”: “integer”}, “category_name”:{ “type”: “keyword”}
keyWord 存储字段串,不会分词,会将整个字段做一个token保存到索引中. -
“seller_id”:{“type”:“integer”}, “seller_remark_score”:{“type”: “double”}, “seller_disabled_flag”:{“type”:“integer”} 商家的一些信息, 商家有可能是会有多个门店的. 商家的评分也会在搜索排序中占一定的比例
构建索引内容
logstash-input-jdbc
也是一个es的插件. 要使用logstash服务. 它的作用就是将mysql和es的建立一个通道,实现一个全量索引构建。
在官网下载一个logstash就可开始搞 了。
- 插件安装
我这里是在windows下安装的,因此需要执行.bat结尾的。 如果是linux 就不用执行.bat结尾的了。
bin/logstash-plugin.bat install logstash-input-jdbc
如果使用es 7.8.1 版本的会出现
表示功能已经被支持了。就不需要在安装了。
- 准备mysql的驱动包
这里就将mysql的驱动包到bin目录下了。
- 编写导入从mysql导入 es的规则和sql
input {
jdbc {
# 设置timezone
jdbc_default_timezone => "Asia/Shanghai"
# mysql 数据库链接,dianpingdb为数据库名
jdbc_connection_string => "jdbc:mysql://39.100.114.219:3306/dianpingdb"
# 用户名和密码
jdbc_user => "root"
jdbc_password => "Root!!2018"
# 驱动
jdbc_driver_library => "/usr/local/elasticsearch/logstash-7.8.1/bin/mysql/mysql-connector-java-5.1.48.jar"
# 驱动类名
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
last_run_metadata_path => "/usr/local/elasticsearch/logstash-7.8.1/bin/mysql/last_value_meta"
# 执行的sql 文件路径+名称
statement_filepath => "/usr/local/elasticsearch/logstash-7.8.1/bin/mysql/jdbc.sql"
# 设置监听间隔 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
}
}
output {
elasticsearch {
# ES的IP地址及端口
hosts => ["www.budongfeng.com:9201"]
# 索引名称
index => "shop"
document_type => "_doc"
# 自增ID 需要关联的数据库中有有一个id字段,对应索引的id号
document_id => "%{id}"
}
stdout {
# JSON格式输出
codec => json_lines
}
}
这里将文件上传至附件中。
- 运行logstash
运行logstash的同时要指定使用哪个配置文件
./logstash -f mysql/jdbc.conf
- 查看索引 就已经有值了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?