在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接口和调优范围。

广告
将在 10 秒后关闭
bannerAds