Enterprise:通过 App search 摄入数据

834 阅读4分钟

App Search 是 Elastic Enterprise Search 的一部分,Elastic Enterprise Search 是由 Elasticsearch 提供支持的内容搜索工具集合。

最初由 App Search 引入的一些功能(例如网络爬虫)现在可以直接通过企业搜索使用。 将这些功能与其他企业搜索工具(例如连接器和搜索 UI 库)相结合。

在今天的文章中,我来详述如何为 App search 写入数据。如果你想把数据库里的数据写入到 App search 中,你可以参考我之前的文章 “Enterprise:如何使用 Python 客户端将数据提取到 App Search 中”。

安装

首先,我们按照文章 “Enterprise:使用 MySQL connector 同步 MySQL 数据到 Elasticsearch” 里所介绍的方法来安装 Elastic Enterprise App search。这里就不再累述了。

准备数据

我们可以在网上链接 TMDB movies and series | Kaggle 下载到 TMDB 的数据。它含有 526,000 个电影及超过 93,000 个 TV 连续剧。我们点击网页上的 Download 按钮:

我们可以使用如下的命令来进行加压缩:

1.  $ pwd
2.  /Users/liuxg/data/movies_tmdb
3.  $ ls
4.  archive.zip 
5.  $ unzip archive.zip 

我们打开 Kibana 界面:

在上面,我们选择 App Search managed docs。

如上所示,目前它提供了三种方法来摄入文件。有关 Crawler 的文章,在我之前的有很多文章都已经做过介绍:

在这里,我们就不做介绍了。如果你对这个话题感兴趣,请详细阅读上面的文章以了解更多。

在上面,我们选择 Paste or upload JSON

我们接下来选择刚才解压其中的一个文档:

 

我们可以看到已经有一个文档被摄入。

 

点击上面的 Documents,我们可以查看被摄入的文档:

 

 

在默认的情况下,所有的字段的类型都是设置为 text 类型。这显然不是我们所期望的。我们可以通过上面的界面来修改字段的数据类型:

我们根据数据所代表的意思来选择合适的类型。通常我选择一个文档来摄入,并调整所有字段的数据类型。否则我们在摄入所有的文档后再进行调整,那么将会比较耗时一些。等我们把数据里各个字段的类型定义好以后,这就完成了我们的 Schema 定义。点击上面的 Save changes

 

我们接下来可以摄入更多的其它文档。

我们也可以使用 Python 代码来摄入文档。我们先下载如下位置的源码:

git clone https://github.com/liu-xiao-guo/tutorials

我们进入到 app-search 目录下,我们可以看到 app_search_ingest.py 文件:

app_search_ingest.py



1.  from elastic_enterprise_search import AppSearch
2.  import glob, os
3.  import json

5.  app_search = AppSearch(
6.      "app_search_api_endpoint",
7.      http_auth="api_private_key"
8.  )

10.  response = []

12.  print("Uploading movies to App Search...")

14.  os.chdir("movies_directory")
15.  for file in glob.glob("*.json"):
16.    with open(file, 'r') as json_file:
17.      try:
18.        response = app_search.index_documents(engine_,documents=json.load(json_file))
19.        print(".", end='', flush=True)
20.      except:
21.        print("Fail!")
22.        print(response)
23.        break


如上所示,我们需要获得 http_auth 里的 private key。我们可以通过如下的方式来获得:

根据我的情况,我修改上面的代码为:



1.  from elastic_enterprise_search import AppSearch
2.  import glob, os
3.  import json

5.  app_search = AppSearch(
6.      "http://localhost:3002",
7.      http_auth="private-49cx4j3qe4pv35n4xxy4b4z7"
8.  )

10.  response = []

12.  print("Uploading movies to App Search...")

14.  os.chdir("/Users/liuxg/data/movies_tmdb/movies/movies")
15.  for file in glob.glob("*.json"):
16.    with open(file, 'r') as json_file:
17.      try:
18.        response = app_search.index_documents(engine_,documents=json.load(json_file))
19.        print(".", end='', flush=True)
20.      except:
21.        print("Fail!")
22.        print(response)
23.        break


我们接下来运行上面的代码:

pip install elastic_enterprise_search

 

我们可以在 Kibana 界面看到新摄入的文档:

在代码的根目录下,我们还可以看到一个 app_search_query.py 的文件。我根据自己的配置,修改如下:

app_search_query.py



1.  import requests

3.  api_endpoint = 'http://localhost:3002' + '/api/as/v1/engines/movies/search'
4.  api_key = 'private-49cx4j3qe4pv35n4xxy4b4z7'

6.  headers = {q'Content-Type': 'application/json',
7.             'Authorization': 'Bearer {0}'.format(api_key)}
8.  query = {'query': 'family'}

10.  response = requests.post(api_endpoint, headers=headers, json=query)
11.  print(response.text)


我们运行代码如下:

我们看到有很多的输出。