本文最后更新于:2021年6月15日 晚上
我们所常见的电商搜索如京东,搜索页面都会提供各种各样的筛选条件,比如品牌、尺寸、适用季节、价格区间等,同时提供排序,比如价格排序,信誉排序,销量排序等,方便了用户去找到自己心里理想的商品。
站内搜索对于一个网站几乎是标配,只是搜索的强大与否的区别,有的网站只支持关键词模糊搜索,而淘宝,京东提供了精细的筛选条件,同时支持拼音搜索等更方便的搜索方式。
由于笔者在一家做网络文学的公司工作,所以实现就是以小说为商品的搜索,具体可以参考起点网小说的搜索。
如图所示,起点网的搜索提供了关键词搜索和排序条件以及筛选条件,接下来,我们一起来实现这个吧~
环境 本文以及后续 es 系列文章都基于 5.5.3 这个版本的 elasticsearch ,这个版本比较稳定,可以用于生产环境。
系列文章
环境准备之 ES 集群搭建 master 配置 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 # wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.3.tar.gz# mkdir /usr/local/es# tar -xvf elasticsearch-5.5.3.tar.gz -C /usr/local/es# cd /usr/local/es/elasticsearch-5.5.3/config vim elasticsearch.yml# http.cors.enabled: true http.cors.allow-origin: "*" cluster.name: es-search node.name: slave1 node.master: true network.host: 0.0.0.0# vim jvm.options 修改 -Xms2g -Xmx2g 为 -Xms512m -Xmx512m 注意,如果是线上,这个内存就不要修改了,使用默认的内存 2G 即可。
slave 配置 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 cd /usr/local/es [root@localhost es ] [root@localhost es ] [root@localhost es ] [root@localhost es ]http.cors.enabled: true http.cors.allow-origin: "*" cluster.name: es-search node.name: slave1 http.port: 8200 network.host: 0.0 .0 .0 [root@localhost es ]http.cors.enabled: true http.cors.allow-origin: "*" cluster.name: es-search node.name: slave2 http.port: 7200 network.host: 0.0 .0 .0
添加用户 [root@localhost es] [root@localhost es] [root@localhost es] [esuser@localhost es]$ chmod 777 /usr/local /es/
启动集群中的 master 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 # 先测试能否正常启动 $ /usr/local/es/master/bin/elasticsearch # 查看打印的日志信息 recovered indices into cluster_state publish_address {127.0.0.1:9200}, bound_addresses {127.0.0.1:9200} started ## 启动失败提示 ERROR: bootstrap checks failed : max file descriptors for elasticsearch process is too low, increase to at least : max virtual memory areas vm.max_map_count is too low, increase to at least ## 切换到 root 用户,修改系统配置 su root # 输入登录密码 vim /etc/security/limits.conf ## 在文件末尾增加,不要去掉前面的 * 号 * soft nofile 300000 * hard nofile 300000 * soft nproc 102400 * soft memlock unlimited * hard memlock unlimited ## 对 sysctl.conf 文件 进行修改 echo "vm.max_map_count=262144" > /etc/sysctl.conf sysctl -p ## 修改完毕,切换回 esuser 用户身份 su esuser ## 尝试启动 $ /usr/local/es/master/bin/elasticsearch # 提示已经启动成功了 publish_address {192.168.199.192:9200}, bound_addresses {:9200} started recovered indices into cluster_state
验证启动 使用浏览器访问 http://ip:9200
ip 替换你的 ip 地址,我的是 http://192.168.199.192:9200
浏览器响应内容
{ name: "master", cluster_name: "es-search", cluster_uuid: "JoNUMEKFS06NHNS7p3bdWg", version: { number: "5.5.3", build_hash: "9305a5e", build_date: "2017-09-07T15:56:59.599Z", build_snapshot: false, lucene_version: "6.6.0" }, tagline: "You Know, for Search" }
注意:如果无法访问,请关闭防火墙
后台守护进程启动 es 集群 前文是直接启动,如果按下 ctrl + c 或者结束 ssh 会话,es 会立即停止退出,因此需要通过守护进程后台启动
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 [esuser@localhost es]$ /usr/ local/es/ master/bin/ elasticsearch -d## 查看是否启动成功 ps -ef | grep elasticsearch## 正常可以看到一个 elasticsearch 进程 ## 如前文一样,分别测试两个 slave 是否可以正常启动 ### 测试slave1 [esuser@localhost es]$ /usr/ local/es/ slave1/bin/ elasticsearch -d### 浏览器访问 http: { "name" :"slave1" , "cluster_name" :"es-search" , "cluster_uuid" :"JoNUMEKFS06NHNS7p3bdWg" , "version" :{ "number" :"5.5.3" , "build_hash" :"9305a5e" , "build_date" :"2017-09-07T15:56:59.599Z" , "build_snapshot" :false, "lucene_version" :"6.6.0" }, "tagline" :"You Know, for Search" }### 测试slave2 [esuser@localhost es]$ /usr/ local/es/ slave2/bin/ elasticsearch -d### 浏览器访问 http: { name: "slave2" , cluster_name: "es-search" , cluster_uuid: "JoNUMEKFS06NHNS7p3bdWg" , version: { number: "5.5.3" , build_hash: "9305a5e" , build_date: "2017-09-07T15:56:59.599Z" , build_snapshot: false, lucene_version: "6.6.0" }, tagline: "You Know, for Search" }
至此完成了 es 集群(伪)的搭建。
环境准备之 elasticsearch head 安装 为了方便我们观察调试,安装这个 es 插件。
安装步骤参考官方 github
cd /usr/ local/es/ git clone git://gi thub.com/mobz/ elasticsearch-head.git cd elasticsearch-head npm install npm run start
在 npm install
这一步,由于国内网络环境的原因,可能会失败,可以npm 换源重试。
启动完成后,浏览器访问 http://ip:9100
,我的是 http://192.168.199.192:9100/
这里需要修改连接地址,为你的 es 所在的 ip:9200。后面集群健康为绿色为正常。
到这里,插件也就安好了。
分词 商品搜索,分词是必不可少的,开源的中文分词最有名的莫过于 IK 分词了,同时为了给用户提供更好的体验,同时配置 pinyin 分词,即输入拼音也可以进行搜索,网上也有对应的分词器,在下文中我们一起来配置分词器。
有疑问? 欢迎来信,给我写信