使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

广告
将在 10 秒后关闭
bannerAds