Enterprise:使用 Elastic Stack 8.2 中的 Elasticsearch API 来定位 App Search 中的文档

Posted Elastic 中国社区官方博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Enterprise:使用 Elastic Stack 8.2 中的 Elasticsearch API 来定位 App Search 中的文档相关的知识,希望对你有一定的参考价值。

在我之前的文章 “Enterprise:Elastic App Search 入门 - Ruby”,我详细地描述了如何使用 Enterprise App Search 打造一个良好的应用搜索。使用 Elastic 8.2 版,你可以轻松地将企业搜索中省时的相关性调优和分析工具与现有的 Elasticsearch 索引结合使用,而无需迁移或更新数据结构。确保从数据采集管道到数据生命周期管理策略的方方面面尽皆齐备,并使用企业搜索中的预配置工具将新的搜索体验快速推向市场。这意味着可实现更快的部署、更直接的相关性管理以及更好地了解您的应用程序、网站和企业中的最终用户搜索行为。 

在本文章的展示中,我将使用 Elastic Stack 8.2 来进行展示。

安装

安装 Elasticsearch

我们可参考我之前的文章 “如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch” 来安装 Elasticsearch。特别地,我们需要安装 Elasticseach 8.2 版本。

在 Elasticsearch 终端输出中,找到 elastic 用户的密码和 Kibana 的注册令牌。 这些是在 Elasticsearch 第一次启动时打印的。

 在单独的终端中,找到由 Elasticsearch 创建的文件 http_ca.crt 的绝对路径名。 例如,在 Elasticsearch 安装目录中使用 find 命令:

find $(pwd) -name 'http_ca.crt'

比如针对我的 macOS 上的安装:

$ find $(pwd) -name 'http_ca.crt'
/Users/liuxg/elastic/elasticsearch-8.2.0/config/certs/http_ca.crt

保存密码、注册令牌和证书路径名。 你将在后面的步骤中需要它们。如果你对这些操作还不是很熟的话,请参考我之前的文章 “Elastic Stack 8.0 安装 - 保护你的 Elastic Stack 现在比以往任何时候都简单”。

安装 Kibana

我们接下来安装 Kibana。我们可以参考我之前的文章 “如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana” 来进行我们的安装。特别地,我们需要安装 Kibana 8.2 版本。如果你还不清楚如何安装 Kibana 8.2,那么请阅读我之前的文章 “Elastic Stack 8.0 安装 - 保护你的 Elastic Stack 现在比以往任何时候都简单”。在启动 Kibana 之前,我们可以修改 Kibana 的配置文件如下。添加如下的句子到 config/kibana.yml 中去:

config/kibana.yml

enterpriseSearch.host: http://localhost:3002

然后,我们使用如下的命令来启动 Kibana:

bin/kibana

 我们在浏览器中输入上面输出的地址然后输入相应的 enrollment token 就可以把 Kibana 启动起来。

 

Java安装

你需要安装 Java。版本在 Java 8 或者 Java 11。我们可以参考链接来查找需要的 Java 版本。

App search 安装

我们在地址 https://www.elastic.co/downloads/app-search 找到我们需要的版本进行下载。并按照相应的指令来进行按照。如果你想针对你以前的版本进行安装的话,请参阅地址 https://www.elastic.co/downloads/past-releases#app-search

等我们下载完 Enterprise Search 的安装包,我们可以使用如下的命令来进行解压缩:

$ pwd
/Users/liuxg/elastic
$ ls enterprise-search-8.2.0.tar.gz 
enterprise-search-8.2.0.tar.gz
$ tar xzf enterprise-search-8.2.0.tar.gz 
$ cd enterprise-search-8.2.0
$ ls
LICENSE    NOTICE.txt README.md  bin        config     lib        metricbeat

如上所示,它含有一个叫做 config 的目录。我们在启动  Enterprise Search 之前,必须做一些相应的配置。我们需要修改 config/enterprise-search.yml 文件。在这个文件中添加如下的内容:

config/enterprise-search.yml

allow_es_settings_modification: true
elasticsearch.username: elastic
elasticsearch.password: YNCJmEr=HJgt8ia9qR=q
elasticsearch.host: https://127.0.0.1:9200
elasticsearch.ssl.enabled: true
elasticsearch.ssl.certificate_authority: /Users/liuxg/elastic/elasticsearch-8.2.0/config/certs/http_ca.crt
kibana.external_url: http://localhost:5601

在上面,请注意 elasticsearch.password 是我们在 Elasticsearch 安装过程中生成的密码。elasticsearch.ssl.certificate_authority 必须根据自己的 Elasticsearch 安装路径中生成的证书进行配置。在上面的配资中,我们还没有配置 secret_management.encryption_keys。我们可以使用上面的配置先运行,然后让系统帮我们生产。

如上所示,当我们我们的配置中还没有配置 secret_management.encryption_keys 时,第一次启动它会帮我们生成一个 key。我们把上面生成的 key 拷贝到 config/enterprise-search.yml 文件中去。最终的配置文件如下:

config/enterprise-search.yml 

allow_es_settings_modification: true
elasticsearch.username: elastic
elasticsearch.password: YNCJmEr=HJgt8ia9qR=q
elasticsearch.host: https://127.0.0.1:9200
elasticsearch.ssl.enabled: true
elasticsearch.ssl.certificate_authority: /Users/liuxg/elastic/elasticsearch-8.2.0/config/certs/http_ca.crt
kibana.external_url: http://localhost:5601
secret_management.encryption_keys: [875e71ba21318a696cac4f5c19deb555d5068b7c92695ea831f09c1b4f72fedd]

这样我们就配置完毕了。我们再次运行 enterprise search:

./bin/enterprise-search 

在启动的过程中,我们可以看到生成的用户名及密码信息:

      username: enterprise_search
      password: 4h4cxdwsnhruxe73

我们记下这个用户名及密码。在启动的过程中,我们还可以看到一个生成的 secret_session_key:

我们也把它拷贝下来,并添加到配置文件中去:

config/enterprise-search.yml 

allow_es_settings_modification: true
elasticsearch.username: elastic
elasticsearch.password: YNCJmEr=HJgt8ia9qR=q
elasticsearch.host: https://127.0.0.1:9200
elasticsearch.ssl.enabled: true
elasticsearch.ssl.certificate_authority: /Users/liuxg/elastic/elasticsearch-8.2.0/config/certs/http_ca.crt
kibana.external_url: http://localhost:5601
secret_management.encryption_keys: [875e71ba21318a696cac4f5c19deb555d5068b7c92695ea831f09c1b4f72fedd]
secret_session_key: 96b01e25968e3ed1a4fee282d3beadd65a1b13f5e6acf3258a98d15aed0787fa9514aab5fd7cfa499b0c4074c5648eb20d3d61eb6ae5bdc079411b97b0ad5ad1
feature_flag.elasticsearch_search_api: true

为了能够使得我们能够在 App Search 中使用 Elasticsearch 搜索,我们必须设置
feature_flag.elasticsearch_search_api: true。 我们再次重新启动 enterprise search:

./bin/enterprise-search 

这次启动后,我们再也不会看到任何的配置输出了。

登录 enterprise search

我们可以直接通过链接 http://localhost:5601/app/enterprise_search/overview 并使用 elastic 超级用户进行登录:

  这样,我们就直接在 Kibana 中进入到 Elastic App Search 的界面了。

另外一种方法是通过如下的导航来进入:

 

在今天的展示中,我将不从 App Search 中创建 engine。我将从另外的一个角度来创建 engine。在 Elastic Stack 8.2 中,我们可以从现有的 Elasticsearch 索引来创建 engine。这对于很多的应用场景来说非常有用,因为我们在很多的时候,索引已经创建好了。如果你想使用其它的方式来创建引擎,并摄入数据,请参考我的文章 “Elastic:开发者上手指南” 中的 “Enterprise search” 章节。

从 Elasticsearch 创建引擎

创建 Elasticsearch 索引

我们还是以我之前文章 “Enterprise:创建 meta 引擎来扩展你的 App search 体验” 中的例子为例来进行展示。我们首先来下载我们需要的数据:

git clone https://github.com/liu-xiao-guo/elastic-meta-engine-datasets

在上面的 repository 里有两个 json 文件:eastern-national-parks.json 及 western-national-parks.json。其中的一个文档的内容如下:

    "description": "Covering most of Mount Desert Island and other coastal islands, Acadia features the tallest mountain on the Atlantic coast of the United States, granite peaks, ocean shoreline, woodlands, and lakes. There are freshwater, estuary, forest, and intertidal habitats.",
    "nps_link": "https://www.nps.gov/acad/index.htm",
    "states": ["Maine"],
    "title": "Acadia",
    "id": "park_acadia",
    "visitors": 3303393,
    "world_heritage_site": false,
    "location": "44.35,-68.21",
    "acres": 49057.36,
    "square_km": 198.5,
    "date_established": "1919-02-26T06:00:00Z"

这两个文档显示的是美国东部及西部的国家公园的一些信息。

我们在 Kibana 里创建一个以 search 为开头的索引。请注意这个 search 也一个要求。我们使用如下的命令来创建一个索引:

PUT search-parks

  "mappings": 
    "properties": 
      "acres": 
        "type": "float"
      ,
      "date_established": 
        "type": "date"
      ,
      "description": 
        "type": "text"
      ,
      "id": 
        "type": "keyword"
      ,
      "location": 
        "type": "geo_point"
      ,
      "nps_link": 
        "type": "keyword"
      ,
      "square_km": 
        "type": "float"
      ,
      "states": 
        "type": "keyword"
      ,
      "title": 
        "type": "keyword"
      ,
      "visitors": 
        "type": "long"
      ,
      "world_heritage_site": 
        "type": "boolean"
      
    
  

我们接下来使用如下的命令来写入3个文档:

PUT search-parks/_doc/1

  "description": "Covering most of Mount Desert Island and other coastal islands, Acadia features the tallest mountain on the Atlantic coast of the United States, granite peaks, ocean shoreline, woodlands, and lakes. There are freshwater, estuary, forest, and intertidal habitats.",
  "nps_link": "https://www.nps.gov/acad/index.htm",
  "states": [
    "Maine"
  ],
  "title": "Acadia",
  "id": "park_acadia",
  "visitors": 3303393,
  "world_heritage_site": false,
  "location": "44.35,-68.21",
  "acres": 49057.36,
  "square_km": 198.5,
  "date_established": "1919-02-26T06:00:00Z"
PUT search-parks/_doc/2

  "description": "On the Congaree River, this park is the largest portion of old-growth floodplain forest left in North America. Some of the trees are the tallest in the eastern United States. An elevated walkway called the Boardwalk Loop guides visitors through the swamp.",
  "nps_link": "https://www.nps.gov/cong/index.htm",
  "states": [
    "South Carolina"
  ],
  "title": "Congaree",
  "id": "park_congaree",
  "visitors": 143843,
  "world_heritage_site": false,
  "location": "33.78,-80.78",
  "acres": 26275.82,
  "square_km": 106.3,
  "date_established": "2003-11-10T06:00:00Z"
PUT search-parks/_doc/3

  "description": "The islands of the Dry Tortugas, at the westernmost end of the Florida Keys, are the site of Fort Jefferson, a Civil War-era fort that is the largest masonry structure in the Western Hemisphere. With most of the park being remote ocean, it is home to undisturbed coral reefs and shipwrecks and is only accessible by plane or boat.",
  "nps_link": "https://www.nps.gov/drto/index.htm",
  "states": [
    "Florida"
  ],
  "title": "Dry Tortugas",
  "id": "park_dry-tortugas",
  "visitors": 73661,
  "world_heritage_site": false,
  "location": "24.63,-82.87",
  "acres": 64701.22,
  "square_km": 261.8,
  "date_established": "1992-10-26T06:00:00Z"

这样我们的 search-birds 里含有3个文档:

GET search-parks/_count

  "count" : 3,
  "_shards" : 
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  

现在我们已经成功地针对以 search 为开始的索引创建了三个文档。

创建 App Search 引擎

我们接下直接使用现有的 Elasticsearch 索引来创建 App Search 的引擎:

 

 从上面,我们可以看出来,以 search 为开头的索引的名字会出现在选择列表中。选择 search-parks:

 

从上面,我们可以看出来,有3个文档已经被成功地摄入到 App Search engine 里。 我们接下来可以仿照文章 “Enterprise:Elastic App Search 入门 - Ruby” 中的步骤来针对我们的 engine 做搜索的定制,比如调整相关性,设置同义词及 curations 等等。在这里,我就不在累述了。

如何从 Elasticsearch 执行和 App Search 一样的搜索

接下来,我们先使用 App Search API 来执行一个 Elasticsearch 的搜索。我们知道在 Kibana 中,我们可以打入如下的搜索:

GET search-parks/_search

  "query": 
    "match_all": 
  

它将显示索引的在  search-birds 里的所有文档。针对我们的情况也就是3个文档。

那么我们是否可以使用 engine API 来实现同样的搜索呢?我们参照博文 “Elasticsearch Search API: A new way to locate App Search documents”。我们创建如下的命令:

curl -X GET 'http://localhost:3002/api/as/v0/engines/search-parks/elasticsearch/_search' \\
  -H 'Content-Type: application/json' \\
  -H 'Authorization: Bearer private-48t1y1if8qsi1bk1q6h9pzfh' \\
  -d '
    "request": 
        "body": 
            "query": 
                "match_all": 
            
        
    
'

请注意:在上面,我们在 Authorization 里使用了一个 private key。我们可以通过如下的方法来得到:

 上面的命令返回的结果为:

 上面的结果显示虽然有些乱,但是我们还是可以看到有三个结果。这个和在 Kibana 中返回的结果是一模一样的。为了显示整齐,我们可以使用如下的命令:

curl -X GET 'http://localhost:3002/api/as/v0/engines/search-parks/elasticsearch/_search' \\
  -H 'Content-Type: application/json' \\
  -H 'Authorization: Bearer private-48t1y1if8qsi1bk1q6h9pzfh' \\
  -d '
    "request": 
        "body": 
            "query": 
                "match_all": 
            
        
    
' | jq '.'

 我们也可以通过 Postman 来实现相应的 REST 请求:

 

我们知道 App Search 有强大的对搜索定制的功能。我们可以在 App Search 里进行同义词,相关性及 curations 的调整。那么我们该如何在 Elasticsearch 中达到同样的搜索效果呢?

首先,我们来做一个正常的 App Search,比如我们使用如下的 API:

http://localhost:3002/api/as/v0/engines/search-parks/search_explain

来显示相应的 Elasticsearch 所需要的搜索:

在上面,我们通过 search_explain API 来展示在 App Search 中搜索一个字符串 desert 与其相对应的 Elasticsearch 搜索请求 body:

 

    "query_body": 
        "query": 
            "bool": 
                "must": 
                    "bool": 
                        "must": [
                            
                                "bool": 
                                    "should": [
                                        
                                            "multi_match": 
                                                "query": "desert",
                                                "minimum_should_match": "1<-1 3<49%",
                                                "type": "cross_fields",
                                                "fields": [
                                                    "description^1.0",
                                                    "_id^1.0",
                                                    "nps_link^1.0",
                                                    "states^1.0",
                                                    "title^1.0"
                                                ]
                                            
                                        
                                    ]
                                
                            
                        ]
                    
                
            
        ,
        "sort": [
            
                "_score": "desc"
            ,
            
                "_doc": "desc"
            
        ],
        "highlight": 
            "fragment_size": 300,
            "type": "plain",
            "number_of_fragments": 1,
            "order": "score",
            "encoder": "html",
            "require_field_match": false,
            "fields": 
        ,
        "size": 10,
        "from": 0,
        "timeout": "30000ms",
        "_source": [
            "acres",
            "date_established",
            "description",
            "id",
            "location",
            "nps_link",
            "square_km",
            "states",
            "title",
            "visitors"
        ]
    

 我们可以在 Kibana 中进行如下的搜索:

GET search-parks/_search

  "query": 
    "bool": 
      "must": 
        "bool": 
          "must": [
            
              "bool": 
                "should": [
                  
                    "multi_match": 
                      "query": "desert",
                      "minimum_should_match": "1<-1 3<49%",
                      "type": "cross_fields",
                      "fields": [
                        "description^1.0",
                        "_id^1.0",
                        "nps_link^1.0",
                        "states^1.0",
                        "title^1.0"
                      ]
                    
                  
                ]
              
            
          ]
        
      
    
  ,
  "sort": [
    
      "_score": "desc"
    ,
    
      "_doc": "desc"
    
  ],
  "highlight": 
    "fragment_size": 300,
    "type": "plain",
    "number_of_fragments": 1,
    "order": "score",
    "encoder": "html",
    "require_field_match": false,
    "fields": 
  ,
  "size": 10,
  "from": 0,
  "timeout": "30000ms",
  "_source": [
    "acres",
    "date_established",
    "description",
    "id",
    "location",
    "nps_link",
    "square_km",
    "states",
    "title",
    "visitors"
  ]

上面显示的结果为:


  "took" : 1,
  "timed_out" : false,
  "_shards" : 
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  ,
  "hits" : 
    "total" : 
      "value" : 1,
      "relation" : "eq"
    ,
    "max_score" : null,
    "hits" : [
      
        "_index" : "search-parks",
        "_id" : "1",
        "_score" : 1.0641946,
        "_source" : 
          "visitors" : 3303393,
          "square_km" : 198.5,
          "date_established" : "1919-02-26T06:00:00Z",
          "description" : "Covering most of Mount Desert Island and other coastal islands, Acadia features the tallest mountain on the Atlantic coast of the United States, granite peaks, ocean shoreline, woodlands, and lakes. There are freshwater, estuary, forest, and intertidal habitats.",
          "location" : "44.35,-68.21",
          "id" : "park_acadia",
          "acres" : 49057.36,
          "title" : "Acadia",
          "nps_link" : "https://www.nps.gov/acad/index.htm",
          "states" : [
            "Maine"
          ]
        ,
        "sort" : [
          1.0641946,
          0
        ]
      
    ]
  

上面的 Elasticsearch 的搜索结果和如下的搜索结果是一样的:

只有一个文档被正确地搜索出来。通过 Elasticsearch 搜索,它重复地使用了 App Search 中的配置(相关性,同义词及 curations)。 

参考:

【1】Elasticsearch Search API: A new way to locate App Search documents | Elastic Blog

【2】API Reference | Elastic App Search Documentation [8.2] | Elastic

以上是关于Enterprise:使用 Elastic Stack 8.2 中的 Elasticsearch API 来定位 App Search 中的文档的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch:部署 ECE (Elastic Cloud Enterprise)

Enterprise:使用 Elastic Stack 8.2 中的 Elasticsearch API 来定位 App Search 中的文档

Elastic Enterprise Search 8.5:用于直观搜索体验的机器学习

Elastic Enterprise Search 8.5:用于直观搜索体验的机器学习

仅存储在 Elastic AppSearch/Enterprise Search 中

Elastic Enterprise Search 在电子商务中创造竞争优势的 6 种方式