在Elasticsearch中进行全文搜索
这篇文章是东京学艺大学榔山研究室2020年圣诞日历的第十一篇文章。
首先
本文介绍了使用Docker构建Elasticsearch,并使用RESTful API将文档注册到Elasticsearch并进行搜索的步骤。
准备Elasticsearch
Elasticsearch是由Elastic公司开发的全文搜索引擎。本次将在Docker上进行启动。
使用的版本是7.10。
FROM docker.elastic.co/elasticsearch/elasticsearch:7.10.0
RUN elasticsearch-plugin install analysis-kuromoji
我们引入了kuromoji插件来进行针对日语的全文搜索。
我想要设置端口和环境变量,所以我准备了docker-compose.yml文件。
version: '3.7'
services:
elasticsearch:
container_name: elasticsearch
build: ./
environment:
- discovery.type=single-node
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- 9200:9200
tty: true
使用docker-compose up命令进行启动。
docker-compose up
如果启动正常,请使用curl命令发送请求。如果收到正确的响应,表示正常运行?♂️。
curl http://localhost:9200
{
"name" : "a868b38a737e",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "xASK1SUISqKRchPyg2OFFg",
"version" : {
"number" : "7.10.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "51e9d6f22758d0374a0f3f5c6e8f3a7997850f96",
"build_date" : "2020-11-09T21:30:33.964949Z",
"build_snapshot" : false,
"lucene_version" : "8.7.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
将文档注册到Elasticsearch中。
我会立即使用curl命令将文档注册到Elasticsearch中。这次我将尝试注册以下形式的json文档。
{
"poet": "天智天皇",
"verse": "秋の田のかりほの庵の苫をあらみ わが衣手は露にぬれつつ"
}
索引名称将被命名为ogura。
curl -XPOST -H 'Content-Type:application/json' \
-d '{"poet":"天智天皇", "verse":"秋の田のかりほの庵の苫をあらみ わが衣手は露にぬれつつ"}' \
http://localhost:9200/ogura/_doc
使用Elasticsearch进行文档搜索
让我们从Elasticsearch注册的文档中进行全文搜索并提取出来。尝试使用”秋”作为查询词进行搜索。
{
"query": {"query_string": { "query": "秋" }}
}
curl -XPOST -H 'Content-Type:application/json' \
-d '{"query": {"query_string": {"query": "秋"}}}' \
http://localhost:9200/ogura/_search
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.2876821,
"hits": [
{
"_index": "ogura",
"_type": "_doc",
"_id": "Au7XUXYBQ0gvhrysI8q9",
"_score": 0.2876821,
"_source": {
"poet": "天智天皇",
"verse": "秋の田のかりほの庵の苫をあらみ わが衣手は露にぬれつつ"
}
}
]
}
}
尽管分数只有0.2876821,但我们可以看出已经取得了成功。
让我们以”天皇”为关键词进行搜索。
curl -XPOST -H 'Content-Type:application/json' \
-d '{"query": {"query_string": {"query": "天皇"}}}' \
http://localhost:9200/ogura/_search
{
"took": 11,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.68324494,
"hits": [
{
"_index": "ogura",
"_type": "_doc",
"_id": "ZiHlUXYB-j-65sbqA5hz",
"_score": 0.68324494,
"_source": {
"poet": "天智天皇",
"verse": "秋の田のかりほの庵の苫をあらみ わが衣手は露にぬれつつ"
}
}
]
}
}
我们可以看到它以比先前更高的得分0.68324494命中。
最后
这次我尝试使用Docker部署全文搜索引擎Elasticsearch,并通过RESTful API进行文档的注册和搜索。
在 Elasticsearch 中,与之前文章中提到的 MySQL 不同,您可以使用非结构化数据(例如 JSON)来保存搜索对象。
通过触摸体验,您会发现这是一个非常出色的软件,它具有广泛的RESTful API接口和调优范围。