使ElasticSearch可以搜索日文文本
做事
使用Docker创建一个容器,并将包含日语的数据导入ElasticSearch,以便能够用日语进行搜索。
启动Docker容器
我們將按照Elasticsearch的公式進行操作。
从Docker Hub安装Docker镜像。
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.1
我要编写docker-compose.yml文件。官方文档中建立了3个集群,但这次我们只建立一个集群。
version: '2.2'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- cluster.initial_master_nodes=es01
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
volumes:
data01:
driver: local
networks:
elastic:
driver: bridge
在包含docker-compose.yml文件的目录中执行以下命令以启动容器。
docker-compose up
安装日文解析插件
安装日语解析插件(kuromoji)来解析公式。
登录到容器中。
docker exec -it 立ち上げたコンテナID /bin/bash
(在↓容器上)
sudo bin/elasticsearch-plugin install analysis-kuromoji
安装完成后,退出Docker容器并重启Docker。
docker restart 立ち上げたコンテナID
回到本地环境后,执行以下操作。
curl http://localhost:9200/_nodes/plugins?pretty
如果有analysis-kuromoji,那就没问题。
(略)
"plugins" : [
{
"name" : "analysis-kuromoji",
"version" : "7.6.2",
"elasticsearch_version" : "7.6.2",
"java_version" : "1.8",
"description" : "The Japanese (kuromoji) Analysis plugin integrates Lucene kuromoji analysis module into elasticsearch.",
"classname" : "org.elasticsearch.plugin.analysis.kuromoji.AnalysisKuromojiPlugin",
"extended_plugins" : [ ],
"has_native_controller" : false
}
(略)
创建索引
由于这次使用Elasticsearch7进行操作,因此没有类型。我们将创建一个可以搜索美术馆和博物馆的索引。
curl -X PUT http://localhost:9200/museum?pretty
只要在执行以上操作后显示创建的索引名称即可。
curl -X GET http://localhost:9200/_cat/indices?v
将数据输入到索引中
作为示例,我们将输入以下数据。
我们将创建一个json文件。
{"pref_id": "13", "city_id": "13101", "name": "国立美術館東京国立近代美術館","location": [139.7547383, 35.6905368]}
{"pref_id": "13", "city_id": "13106", "name": "上野の森美術館", "location": [139.7747384, 35.7127347]}
博物馆的索引名称是museum,创建的数据为sample.json。
curl -H "Content-Type: application/json" -XPOST http://localhost:9200/museum/_bulk --data-binary @sample.json
如果能够获取到下面注册的数据就可以了。
curl -XGET http://localhost:9200/facility/_search?pretty
创建查询
在Elasticsearch的文档搜索功能中,有几种类型(如部分匹配,完全匹配等),但这次我们将使用match_phrase。
match_phrase可以返回包含指定短语的数据。
{
"query": {"match_phrase": { "name": "国立" } }
}
搜索
使用指定的JSON进行搜索。
curl -H "Content-Type: application/json" -X GET http://localhost:9200/facility/_search --data-binary @sample_query.json
最终获得能够满足条件的数据。 (部分内容已省略。)
{
"took":324,
"timed_out":false,
"_shards":
{
"total":1,
"successful":1,
"skipped":0,
"failed":0
},
"hits":
{
"_index":"museum",
"_type":"_doc",
"_id":"1",
"_source":
{
"pref_id": "13",
"city_id": "13103",
"name": "国立美術館国立新美術館",
"location": [139.7263974, 35.6652779]
}
}
}
请参考
以下是两个网址:
1. Elastic 官方网站提供了关于执行搜索的指南:https://www.elastic.co/guide/jp/elasticsearch/reference/current/gs-executing-searches.html
2. 这个博客中的文章提供了有关搜索执行的内容:https://blog.chocolapod.net/momokan/entry/114