菜单

Core和Docker可视化数据,实现推荐系统

2020年1月11日 - 4166am金沙下载
Core和Docker可视化数据,实现推荐系统

如果您使用过 Apache Lucene
或 Apache Solr,就会知道它们的使用体验非常有趣。尤其在您需要扩展基于
Lucene 或 Solr
的解决方案时,您就会了解 Elasticsearch 项目背后的动机。Elasticsearch(构建于
Lucene
之上)在一个容易管理的包中提供了高性能的全文搜索功能,支持开箱即用地集群化扩展。您可以通过标准的
REST
API
或从特定于编程语言的客户端库与 Elasticsearch 进行交互。

原文地址

原文地址:http://www.dotnetcurry.com/aspnet/1354/elastic-search-kibana-in-docker-dotnet-core-app

本教程将展示 Elasticsearch 的实际工作原理。首先从命令行访问该 REST API
来了解它的基本信息。然后设置一个本地 Elasticsearch
服务器,并从一个简单的 Java
应用程序与它交互。请参见 下载 部分,获取有关的示例代码。

本文内容

本文介绍如何用带 Apache Mahout 的 MapR
Sandbox for Hadoop

Elasticsearch
搭建推荐引擎,只需要很少的代码。

This tutorial will give step-by-step instructions on how to:

想要轻松地通过许多不同的方式查询数据,甚至是从未预料到的方式?想要以多种方式可视化日志?同时支持基于时间、文本和其他类型的即时过滤器?
借助于 ** Elastic ** stack
的卓越性能和可扩展方式的优点,我们将通过两个示例轻松实现。

前提条件

要理解本教程的所有示例,需要在您的系统上安装
Elasticsearch。下载针对您的平台的 最新 Elastic Search
程序包。将该包解压到一个方便的位置。在
UNIX 或 Linux 上,通过以下命令启动该实例:

/elastic-search-dir/bin/elasticsearch

4166m金沙,在 Windows 上,运行

/elastic-search-dir/bin/elasticsearch.bat

在看到日志消息 started 时,该节点已准备好接受请求。

对于 Java
示例,还需要安装 Eclipse 和 Apache
Maven。如果您的系统上还没有它们,请下载和安装它们。

您还需要 cURL。在 Microsoft Windows 上,我使用 Git
Bash shell
来运行 cURL。

软件


该文章运行在 MapReduce Sandbox。还要求在 Sandbox 上安装 Elasticsearch 和
Mahout。

本文由 DNC Magazine for Developers and Architects 发布。
从这里下载此杂志
*[PDF] 或
*免费订阅本杂志
下载所有以前和当前的版本版本。

使用 cURL 执行 REST 命令

可以对 Elasticsearch 发出 cURL 请求,这样很容易从命令行 shell
体验该框架。

“Elasticsearch
是无模式的。它可以接受您提供的任何命令,并处理它以供以后查询。”

Elasticsearch
是无模式的,这意味着它可以接受您提供的任何命令,并处理它以供以后查询。Elasticsearch
中的所有内容都被存储为文档,所以您的第一个练习是存储一个包含歌词的文档。首先创建一个索引,它是您的所有文档类型的容器
— 类似于 MySQL
等关系数据库中的数据库。然后,将一个文档插入该索引中,以便可以查询该文档的数据。

步骤


在这篇文章中,我将介绍流行的搜索引擎 Elasticsearch,其配套的可视化应用
Kibana,并展示如何对.NET核心可以轻松地与 Elastic stack 整合在一块。

创建一个索引

Elasticsearch 命令的一般格式是:REST VERBHOST:9200/index/doc-type
其中 REST VERB 是 PUTGET 或 DELETE。(使用
cURL -X 动词前缀来明确指定 HTTP 方法。)

要创建一个索引,可在您的 shell 中运行以下命令:

curl -XPUT "http://localhost:9200/music/"

Step 1: 索引(Index)电影元数据到 Elasticsearch

在 Elasticsearch
中,默认情况下,文档的所有字段都会被索引。最简单的文档是只有一级 JSON
结构。文档包含在索引中,文档中的类型告诉 Elasticsearch
如何解释文档中的字段。

你可以把 Elasticsearch
的索引看做是关系型数据库中的数据库实例,而类型看做是数据库表,字段看做表定义(但是这个字段,在
Elasticsearch 中的意义更广泛),文档看做是表的某行记录。

针对本例,文档类型是
film。并具有如下字段:电影ID(id)、标题(title)、上映时间(year)、电影类型/标签(genre,基因)、指示(indicators)、indicators数组的数量(numFields):

{

 "id": "65006",

 "title": "Impulse",

 "year": "2008",

 "genre": ["Mystery","Thriller"],

 "indicators": ["154","272",”154","308", "535", "583", "593", "668", "670", "680", "702", "745"],

 "numFields": 12

}

通过 9200 端口访问 Elasticsearch RESTful API 与其通信,或者命令行用 curl
命令。参看 Elasticsearch REST
interface
和 Elasticsearch 101
tutorial。

curl -X<VERB> 'http://<HOST>/<PATH>?<QUERY_STRING>' -d '<BODY>'

使用 Elasticsearch’s REST API 的 put
mapping
命令可以定义文档的类型。下面的请求在 bigmovie 索引中创建名为 film
的映射(mapping)。该映射定义一个类型为 integer 类型的 numFields
字段。默认情况,所有字段都被存储并索引,整型也如此。

curl -XPUT 'http://localhost:9200/bigmovie' -d '

{

  "mappings": {

    "film" : {

      "properties" : {

        "numFields" : { "type" :   "integer" }

      }

    }

  }

}'

电影信息包含在 movies.dat
文件中。文件的每行表示一部电影,字段的含义如下所示:

MovieID::Title::Genres

例如:

65006::Impulse (2008)::Mystery|Thriller

4166m金沙 1

图 1
电影《冲动(Impulse)》(2008)、类型“悬疑/惊悚”

下面 Python 脚本把 movies.dat 文件中的数据转换成 JSON 格式,以便导入
Elasticsearch:

import re

import json

count=0

with open('movies.dat','rb') as csv_file:

   content = csv_file.readlines()

   for line in content:

        fixed = re.sub("::", "\t", line).rstrip().split("\t")

   if len(fixed)==3:

          title = re.sub(" \(.*\)$", "", re.sub('"','', fixed[1]))

          genre = fixed[2].split('|')

          print '{ "create" : { "_index" : "bigmovie", "_type" : "film",

          "_id" : "%s" } }' %  fixed[0]

          print '{ "id": "%s", "title" : "%s", "year":"%s" , "genre":%s }'

          % (fixed[0],title, fixed[1][-5:-1], json.dumps(genre))

运行该 Python 文件,转换结果输出到 index.json:

$ python index.py > index.json

将产生如下 Elasticsearch 需要的格式:

{ "create" : { "_index" : "bigmovie", "_type" : "film", "_id" : "1" } }

{ "id": "1", "title" : "Toy Story", "year":"1995" , "genre":["Adventure", "Animation", "Children", "Comedy", "Fantasy"] }

{ "create" : { "_index" : "bigmovie", "_type" : "film", "_id" : "2" } }

{ "id": "2", "title" : "Jumanji", "year":"1995" , "genre":["Adventure", "Children", "Fantasy"] }

文件中的每行创建索引和类型,并添加电影信息。这是利用 Elasticsearch
批量导入数据。

Elasticsearch 批量 API 可以执行对索引的操作,用同一个 API,不同的 http
请求(如 get、put、post、delete)。下面命令让 Elasticsearch 批量加载
index.json 文中的内容:

curl -s -XPOST localhost:9200/_bulk --data-binary @index.json; echo

加载电影信息后,你就可以利用 REST API 进行查询了。你也可以使用 Chrome 的
Elasticsearch 插件——Sense
进行操作(Kibana 4 提供的一个插件)。示例如下所示:

4166m金沙 2

下面是检索 id 为 1237的电影:

4166m金沙 3

4166m金沙 4

模式可选

尽管 Elasticsearch 是无模式的,但它在幕后使用了
Lucene,后者使用了模式。不过 Elasticsearch
为您隐藏了这种复杂性。实际上,您可以将 Elasticsearch
文档类型简单地视为子索引或表名称。但是,如果您愿意,可以指定一个模式,所以您可以将它视为一种模式可选的数据存储。

Step 2: 使用 Mahout 从用户评分数据中创建 Movie indicators

评分包含在 ratings.dat
文件中。该文件每行表示某个用户对某个电影的评分,格式如下所示:

UserID::MovieID::Rating::Timestamp

例如:

71567::2294::5::912577968

71567::2338::2::912578016

ratings.data 文件用 “::” 做分隔符,转换成 tab 后 Mahout 才能使用。可以用
sed 命令把 :: 替换成 tab:

sed -i 's/::/\t/g' ratings.dat

该命令打开文件,把”::” 替换成”\t” 后,重新保存。Updates are only
supported with MapR NFS and thus this command probably won’t work on
other NFS-on-Hadoop implementations. MapR Direct Access NFS allows files
to be modified (supports random reads and writes) and accessed via
mounting the Hadoop cluster over NFS.

sed 命令会产生如下格式的内容,该格式可以作为 Mahout 的输入:

71567    2294    5    912580553

71567    2338    2    912580553

一般格式为:item1 item2 rating timestamp,即“物品1 物品2
评分”,本例不使用 timestamp。

启动 Mahout 物品相似度(itemsimilarity)作业,命令如下所示:

 mahout itemsimilarity \

  --input /user/user01/mlinput/ratings.dat \

  --output /user/user01/mloutput \

  --similarityClassname SIMILARITY_LOGLIKELIHOOD \

  --booleanData TRUE \

  --tempDir /user/user01/temp

The argument “-s SIMILARITY_LOGLIKELIHOOD” tells the recommender to use
the Log Likelihood Ratio (LLR) method for determining which items
co-occur anomalously often and thus which co-occurrences can be used as
indicators of preference. 相似度默认是 0.9;this can be adjusted based
on the use case with the –threshold parameter, which will discard pairs
with lower similarity (the default is a fine choice). Mahout
通过启动很多 Hadoop MapReduce
作业计算推荐,最后将产生输出文件,该文件位于 /user/user01/mloutput
目录。输出文件格式如下所示

64957   64997   0.9604835425701245
64957   65126   0.919355104432831
64957   65133   0.9580439772229588

一般格式为:item1id item2id similarity,即“物品1 物品2 相似度”。

Elasticsearch和.Net Core

插入一个文档

要在 /music 索引下创建一个类型,可插入一个文档。在第一个示例中,您的文档包含数据(包含一行)“Deck
the Halls” 的歌词,这是一首最初由威尔士诗人 John Ceirog Hughes 于 1885
年编写的传统的圣诞歌曲。

要将包含 “Deck the Halls”
的文档插入索引中,可运行以下命令(将该命令和本教程的其他 cURL
命令都键入到一行中):

curl -XPUT "http://localhost:9200/music/songs/1" -d '
{ "name": "Deck the Halls", "year": 1885, "lyrics": "Fa la la la la" }'

前面的命令使用 PUT 动词将一个文档添加到 /songs 文档类型,并为该文档分配
ID 1。URL 路径显示为 index/doctype/ID

Step 3: 添加 Movie indicators 到 Elasticsearch 的电影文档

下一步,我们从上面的输出文件添加 indicators 到 Elasticsearch 的 film
文档。例如,把电影的 indicators 放到 indicators 字段:

{

  "id": "65006",

  "title": "Impulse",

  "year": "2008",

  "genre": ["Mystery","Thriller"],

  "indicators": ["1076", "1936", "2057", "2204"],

  "numFields": 4

}

左面的表显示文档中包含 indicator 的内容,右边的表显示哪些文档包含某个
indicator:

4166m金沙 5

图 2 文档与 indicator

如果想要检索 indicator 为 1237551 的电影,那么本例将返回 id
为 8298 的文档(电影)。如果检索 1237551,那么将返回 id 为
8298、3 和 64418 的电影。

4166m金沙 6

下面脚本将读取 Mahout 的输出文件 part-r-00000,为每部电影创建 indicator
数组,然后输出 JSON 文件,用该文件更新 Elasticsearch bigmovie 索引的
film 类型的 indicator 字段。

import fileinput

from string import join

import json

import csv

import json

### read the output from MAHOUT and collect into hash ###

with open('/user/user01/mloutput/part-r-00000','rb') as csv_file:

    csv_reader = csv.reader(csv_file,delimiter='\t')

    old_id = ""

    indicators = []

    update = {"update" : {"_id":""}}

    doc = {"doc" : {"indicators":[], "numFields":0}}

    for row in csv_reader:

        id = row[0]

        if (id != old_id and old_id != ""):

            update["update"]["_id"] = old_id

            doc["doc"]["indicators"] = indicators

            doc["doc"]["numFields"] = len(indicators)

            print(json.dumps(update))

            print(json.dumps(doc))

            indicators = [row[1]]

        else:

            indicators.append(row[1])

        old_id = id

下面命令会执行 update.py 的 Python 脚本,并输出 update.json:

$ python update.py > update.json

上面 Python 脚本将创建如下内容的文件:

{"update": {"_id": "1"}}

{"doc": {"indicators": ["75", "118", "494", "512", "609", "626", "631", "634", "648", "711", "761", "810", "837", "881", "910", "1022", "1030", "1064", "1301", "1373", "1390", "1588", "1806", "2053", "2083", "2090", "2096", "2102", "2286", "2375", "2378", "2641", "2857", "2947", "3147", "3429", "3438", "3440", "3471", "3483", "3712", "3799", "3836", "4016", "4149", "4544", "4545", "4720", "4732", "4901", "5004", "5159", "5309", "5313", "5323", "5419", "5574", "5803", "5841", "5902", "5940", "6156", "6208", "6250", "6383", "6618", "6713", "6889", "6890", "6909", "6944", "7046", "7099", "7281", "7367", "7374", "7439", "7451", "7980", "8387", "8666", "8780", "8819", "8875", "8974", "9009", "25947", "27721", "31660", "32300", "33646", "40339", "42725", "45517", "46322", "46559", "46972", "47384", "48150", "49272", "55668", "63808"], "numFields": 102}}

{"update": {"_id": "2"}}

{"doc": {"indicators": ["15", "62", "153", "163", "181", "231", "239", "280", "333", "355", "374", "436", "473", "485", "489", "502", "505", "544", "546", "742", "829", "1021", "1474", "1562", "1588", "1590", "1713", "1920", "1967", "2002", "2012", "2045", "2115", "2116", "2139", "2143", "2162", "2296", "2338", "2399", "2408", "2447", "2616", "2793", "2798", "2822", "3157", "3243", "3327", "3438", "3440", "3477", "3591", "3614", "3668", "3802", "3869", "3968", "3972", "4090", "4103", "4247", "4370", "4467", "4677", "4686", "4846", "4967", "4980", "5283", "5313", "5810", "5843", "5970", "6095", "6383", "6385", "6550", "6764", "6863", "6881", "6888", "6952", "7317", "8424", "8536", "8633", "8641", "26870", "27772", "31658", "32954", "33004", "34334", "34437", "39419", "40278", "42011", "45210", "45447", "45720", "48142", "50347", "53464", "55553", "57528"], "numFields": 106}}

在命令行,用 curl 命令调用 Elasticsearch REST
bulk
请求,把该文件 update.json 作为输入,就可以更新 indicator 字段:

$ curl -s -XPOST localhost:9200/bigmovie/film/_bulk --data-binary @update.json; echo

我们将开始探索 Elasticsearch 的 REST API
,通过索引和查询某些数据。接着,我们将使用Elasticsearch官方的 .Net API
完成类似的练习。一旦熟悉 Elasticsearch 及其 API 后,我们将使用 .Net Core
创建一个日志模块,并将数据发送到 Elasticsearch
。Kibana紧随其中,以有趣的方式可视化 Elasticsearch 的索引数据。
我迫切希望你会认为这篇文章十分有趣,并且想要了解更多关于Elastic的强大之处。

查看文档

要查看该文档,可使用简单的 GET 命令:

curl -XGET "http://localhost:9200/music/songs/1"

Elasticsearch 使用您之前 PUT 进索引中的 JSON 内容作为响应:

{"_index":"music","_type":"songs","_id":"1","_version":1,"found":true,"_source":
{ "name": "Deck the Halls", "year": 1885, "lyrics": "Fa la la la la" }}

Step 4: 检索 Film 索引的 indicator 字段进行推荐

现在,你就可以检索 film 的 indicator
字段进行查询并推荐。例如,某人喜欢电影 1237 和
551,你想推荐类似的电影,可以执行如下 Elasticsearch
查询获得推荐,将返回indicator 数组为 1237 和 551 的电影,即
1237=Seventh Seal(第七封印),551=Nightmare Before
Christmas(圣诞夜惊魂)

curl 'http://localhost:9200/bigmovie/film/_search?pretty' -d '

{

  "query": {

    "function_score": {

      "query": {

         "bool": {

           "must": [ { "match": { "indicators":"1237 551"} } ],

           "must_not": [ { "ids": { "values": ["1237", "551"] } } ]

         }

      },

      "functions":[ {"random_score": {"seed":"48" } } ],

      "score_mode":"sum"

    }

  },

  "fields":["_id","title","genre"],

  "size":"8"

}'

上面查询 indicator 为 1237 或 551,并且不是 1237 或 551
的电影。下面示例使用 Sense 插件进行查询,右边是检索结果,推荐结果是 “A
Man Named Pearl(这个是纪录片)” 和 “Used People(寡妇三弄)”。

4166m金沙 7

本文假设您已经了解 C#和 REST API 的基本知识。使用 Visual
Studio,Postman 和 Docker 等工具,但您可以轻松使用 VS Code 和 Fiddler
等替代方案。

更新文档

如果您认识到日期写错了,并想将它更改为 1886
怎么办?可运行以下命令来更新文档:

curl -XPUT "http://localhost:9200/music/lyrics/1" -d '{ "name": 
"Deck the Halls", "year": 1886, "lyrics": "Fa la la la la" }'

因为此命令使用了相同的唯一 ID 1,所以该文档会被更新。

控制相关性

全文检索引擎根据相关度排序,Elasticsearch 用 _score
字段表示文档的相关度分数(relevance
score)。function_score
允许你查询时修改该分数。random_score
用一个种子变量使用散列生成分数。Elasticsearch
查询如下所示,random_score 函数用于把变量添加到检索结果,以便完成
dithering:

  "query": {

    "function_score": {

      "query": {

         "bool": {

           "must": [ { "match": { "indicators":"1237 551"} } ],

           "must_not": [ { "ids": { "values": ["1237", "551"] } } ]

         }

      },

      "functions":[ {"random_score": {"seed":"48" } } ],

      "score_mode":"sum"

    }

  }

相关性抖动(dithering)有意地包含排名靠,但相关性较低的结果,以便拓展训练数据,提供给推荐引擎。如果没有
dithering,那么明天的训练数据仅仅是教模型今天已经知道的事情。增加
dithering, 会帮助拓展推荐模型。如果模型给出的答案接近优秀的,那么
dithering 可以帮助找到正确答案。有效的 dithering
会减少今天的准确性,而改进明天的训练数据(和未来的性能,算法的准确性也属于性能的范畴),换句话说,为了让将来的推荐准确,需要减少过去对将来的影响。

Elasticsearch – 简介#

Elasticsearch
作为核心的部分,是一个具有强大索引功能的文档存储库,并且可以通过 REST
API 来搜索数据。它使用 Java 编写,基于 Apache
Lucene,尽管这些细节隐藏在
API 中。
通过被索引的字段,可以用许多不同的聚合方式找到任何被存储(索引)的文档。
但是,ElasticSearch不仅仅只提供对这些被索引文档的强大搜索功能。
快速、分布式、水平扩展,支持实时文档存储和分析,支持数百台服务器和 PB
级索引数据。同时作为 Elastic stack (aka ELK) 的核心,提供了诸如
LogStash、Kibana 和更多的强大应用。
Kibana 是 Elasticsearch
中专门提供强有力的可视化查询Web应用程序。使用Kibana,能非常简单地为
Elasticsearch 中索引的数据创建查询、图表和仪表盘。
Elasticsearch开放了一个 REST API,你会发现许多文档示例是 HTTP
调用,你可以尝试使用 curl 或 postman 等工具。当然,这个 API
的客户端已经用许多不同的语言编写,包括.Net、Java、Python、Ruby和JavaScript等。
如果你想阅读更多,Elasticsearch
官方网站
可能是最好的地方。

删除文档(但暂时不要删除)

暂时不要删除该文档,知道如何删除它就行了:

curl -XDELETE "http://localhost:9200/music/lyrics/1"

总结


We showed in this tutorial how to use Apache Mahout and Elasticsearch
with the MapR Sandbox to build a basic recommendation engine. You can go
beyond a basic recommender and get even better results with a few simple
additions to the design to add cross recommendation of items, which
leverages a variety of interactions and items for making
recommendations. You can find more information about these technologies
here:

Docker是在本地运行的最简方式#

在这篇文章中,我们需要先连接到一个 Elasticsearch
(和后面的Kibana)的服务器。如果您已经有一个在本地运行或可以使用的服务器,那很好。否则需要先搭建一个服务器。
您可以选择在您的本地机器或可以使用的 VM 或服务器中下载和安装
Elasticsearch 和 Kibana 。不过,建议您使用最简单最纯粹的方式,使用Docker
搭建 Elasticsearch 和 Kibana 。
您可以直接运行以下命令,获取包含Elasticsearch和Kibana的容器。

docker run -it --rm -p 9200:9200 -p 5601:5601 --name esk nshou/elasticsearch-kibana

在同一个容器中运行多个应用程序,就像我们现在这种做法,非常适用本文,但不是推荐用于生产容器!

您应该意识到,一旦你删除容器,你的数据就会消失(一旦你使用-rm选项就删除它了)。虽然有利于本地实验,但在实际环境中,如果您不想丢失数据,请参照
“data container” 模式。

Docker是一个很棒的工具,我鼓励你更多地了解它,特别是如果你想做更重要的事情,而不仅仅是跟随本文,在本地快速搭建
Elasticsearch 服务器。在之前的文章
Building DockNetFiddle using
Docker and .NET
Core

中已经对 .NET Core 搭配 Docker 有很好的介绍。

只需打开
http://localhost:9200

http://localhost:5600
,检查Elasticsearch 和 Kibana 是否都可以使用。(如果您使用docker
toolbox,请使用托管Docker的虚拟机ip替换localhost,您可以在命令行中运行
docker-machine env default )。

4166m金沙 8

在docker中运行 Elasticsearch

4166m金沙 9

kibana也准备好了

从文件插入文档

这是另一个技巧。您可以使用一个文件的内容来从命令行插入文档。尝试此方法,添加另一首针对传统歌曲
“Ballad of Casey Jones” 的文档。将清单 1 复制到一个名为 caseyjones.json
的文件中;也可以使用示例代码包中的 caseyjones.json
文件(参见 下载)。将该文件放在任何方便对它运行
cURL 命令的地方。(在下载的代码中,该文件位于根目录中。)

参考资料


若想学习更多关于推荐引擎的组件和逻辑,参看 “An Inside Look at the
Components of a Recommendation
Engine”,该文章详细描述了推荐引擎的架构、Mahout
协同过滤(collaborative filtering)和 Elasticsearch 检索引擎。

更多关于推荐引擎、机器学习和 Elasticsearch 的资源,如下所示:

Tutorial Category Reference:

在 Elasticsearch 中索引和查询

在我们开始编写任何 .Net 代码之前,我们先了解一下一些基本知识。先在
Elasticsearch
索引一些文档(类似于存到数据库),以便我们对它们运行不同的查询。

*在这里,我将使用Postman向我们的 Elasticsearch 服务器发送 HTTP
请求,但您可以使用任何其他类似的工具,如
[Fiddler]()
*curl

我们要做的第一件事是请求 Elasticsearch 创建一个新的索引
(译者语:类似创建一个表) 并索引一些文档 (译者语:类似于在数据中插入数据)
。这类似于将数据存储在表/集合中,主要区别(和目的)是让 Elasticsearch
集群 (这里只是一个节点) 可以分析和搜索文档数据。
被索引的文档在 Elasticsearch
中以索引和类型进行组织。以往,被拿来和数据库表做对比,往往会令人困惑。如这篇文章所述,索引由Lucene处理,在分布式跨
分片 中,与类型紧密地联系在一起。
发送以下两个请求以创建索引,并在该索引中插入文档 (请记住
toolbox,如果使用docker ,请使用托管Docker的虚拟机ip而不是localhost) :

PUT localhost:9200/default

PUT localhost:9200/default/product/1
{ 
    "name": "Apple MacBook Pro",
    "description": "Latest MacBook Pro 13",
    "tags": ["laptops", "mac"]
}

4166m金沙 10

创建一个新索引

4166m金沙 11

索引新文档

在我们验证搜索功能和查询数据之前,再索引几个 “product”。尝试使用不同的
“tags”,如 “laptops”和 “laptops”,并记得使用不同的ids!
完成后,让我们按名称排序的搜索所有被索引的文档。您可以使用查询字符串或
GET/POST 同样的内容,下面两个请求是等效的:

GET http://localhost:9200/default/_search?q=*&sort=name.keyword:asc

POST http://localhost:9200/default/_search
{
  "query": { "match_all": {} },
  "sort": [
    { "name.keyword": "asc" }
  ]
}

让我们尝试一些更有趣的东西,例如搜索 “description” 字段中含有 “latest”
,同时 “tags” 字段中含有 “laptops” 的所有文档:

POST http://localhost:9200/default/_search
{
  "query": { 
      "bool": {
      "must": [
        { "match": {"description": "latest"} },
        { "match": { "tags": "laptops" } }
      ]
    }
  },
  "sort": [
    { "name.keyword": "asc" }
  ]
}

4166m金沙 12

搜索结果

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图