Elasticsearch入門

ElasticSearch是一個(gè)高度可擴(kuò)展的開源搜索引擎并使用REST API,所以您值得擁有。 在本教程中,將介紹開始使用ElasticSearch的一些主要概念。

下載并運(yùn)行ElasticSearch

ElasticSearch可以從elasticsearch.org下載對(duì)應(yīng)的文件格式,如ZIPTAR.GZ。下載并提取一個(gè)運(yùn)行它的軟件包之后不會(huì)容易得多,需要提前安裝Java運(yùn)行時(shí)環(huán)境。

在Windows上運(yùn)行ElasticSearch

在本文章中,所使用的環(huán)境是Windows,所以這里只介紹在Windows上運(yùn)行ElasticSearch,可從命令窗口運(yùn)行位于bin文件夾中的elasticsearch.bat。這將會(huì)啟動(dòng)ElasticSearch在控制臺(tái)的前臺(tái)運(yùn)行,這意味著我們可在控制臺(tái)中看到運(yùn)行信息或一些錯(cuò)誤信息,并可以使用CTRL + C停止或關(guān)閉它。

當(dāng)前版本是: elasticsearch-5.2.0
下載鏈接: http://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.0.zip

把下載好的文件 elasticsearch-5.2.0.zip 解壓到 D:\software\elasticsearch-5.2.0,其目錄結(jié)構(gòu)如下所示 -

啟動(dòng) ElasticSearch -

Microsoft Windows [版本 10.0.10586]
(c) 2015 Microsoft Corporation。保留所有權(quán)利。

C:\Users\Administrator>d:

D:\>cd software\elasticsearch-5.2.0

D:\software\elasticsearch-5.2.0>cd bin

D:\software\elasticsearch-5.2.0\bin>elasticsearch.bat
[2017-01-28T14:10:32,177][INFO ][o.e.n.Node               ] [] initializing ...
[2017-01-28T14:10:32,670][INFO ][o.e.e.NodeEnvironment    ] [SnafGWM] using [1] data paths, mounts [[Software (D:)]], net usable_space [61.6gb], net total_space [139gb], spins? [unknown], types [NTFS]
[2017-01-28T14:10:32,686][INFO ][o.e.e.NodeEnvironment    ] [SnafGWM] heap size [1.9gb], compressed ordinary object pointers [true]
[2017-01-28T14:10:32,686][INFO ][o.e.n.Node               ] node name [SnafGWM] derived from node ID [SnafGWMWRzmfwTKP6VJClA]; set [node.name] to override
[2017-01-28T14:10:32,717][INFO ][o.e.n.Node               ] version[5.2.0], pid[9724], build[24e05b9/2017-01-24T19:52:35.800Z], OS[Windows 10/10.0/amd64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_65/25.65-b01]
[2017-01-28T14:10:35,271][INFO ][o.e.p.PluginsService     ] [SnafGWM] loaded module [aggs-matrix-stats]
[2017-01-28T14:10:35,271][INFO ][o.e.p.PluginsService     ] [SnafGWM] loaded module [ingest-common]
[2017-01-28T14:10:35,271][INFO ][o.e.p.PluginsService     ] [SnafGWM] loaded module [lang-expression]
[2017-01-28T14:10:35,271][INFO ][o.e.p.PluginsService     ] [SnafGWM] loaded module [lang-groovy]
[2017-01-28T14:10:35,271][INFO ][o.e.p.PluginsService     ] [SnafGWM] loaded module [lang-mustache]
[2017-01-28T14:10:35,287][INFO ][o.e.p.PluginsService     ] [SnafGWM] loaded module [lang-painless]
[2017-01-28T14:10:35,287][INFO ][o.e.p.PluginsService     ] [SnafGWM] loaded module [percolator]
[2017-01-28T14:10:35,288][INFO ][o.e.p.PluginsService     ] [SnafGWM] loaded module [reindex]
[2017-01-28T14:10:35,290][INFO ][o.e.p.PluginsService     ] [SnafGWM] loaded module [transport-netty3]
[2017-01-28T14:10:35,291][INFO ][o.e.p.PluginsService     ] [SnafGWM] loaded module [transport-netty4]
[2017-01-28T14:10:35,292][INFO ][o.e.p.PluginsService     ] [SnafGWM] no plugins loaded
[2017-01-28T14:10:41,394][INFO ][o.e.n.Node               ] initialized
[2017-01-28T14:10:41,397][INFO ][o.e.n.Node               ] [SnafGWM] starting ...
[2017-01-28T14:10:42,657][INFO ][o.e.t.TransportService   ] [SnafGWM] publish_address {127.0.0.1:9300}, bound_addresses {127.0.0.1:9300}, {[::1]:9300}
[2017-01-28T14:10:46,439][INFO ][o.e.c.s.ClusterService   ] [SnafGWM] new_master {SnafGWM}{SnafGWMWRzmfwTKP6VJClA}{vG5mFSENST6eo-yl_O8HuA}{127.0.0.1}{127.0.0.1:9300}, reason: zen-disco-elected-as-master ([0] nodes joined)
[2017-01-28T14:10:48,628][INFO ][o.e.h.HttpServer         ] [SnafGWM] publish_address {127.0.0.1:9200}, bound_addresses {127.0.0.1:9200}, {[::1]:9200}
[2017-01-28T14:10:48,628][INFO ][o.e.n.Node               ] [SnafGWM] started
[2017-01-28T14:10:48,928][INFO ][o.e.g.GatewayService     ] [SnafGWM] recovered [0] indices into cluster_state

在啟動(dòng)過程中,ElasticSearch的實(shí)例運(yùn)行會(huì)占用大量的內(nèi)存,所以在這一過程中,電腦會(huì)變得比較慢,需要耐心等待,啟動(dòng)加載完成后電腦就可以正常使用了。

如果您沒有安裝Java運(yùn)行時(shí)或沒有正確配置,應(yīng)該不會(huì)看到像上面的輸出,而是一個(gè)消息說(shuō)“JAVA_HOME環(huán)境變量必須設(shè)置!" 要解決這個(gè)問題,首先下載并安裝Java,其次,確保已正確配置JAVA_HOME環(huán)境變量(或參考 - Java JDK安裝和配置)。

使用REST API與Sense

當(dāng)ElasticSearch的實(shí)例并運(yùn)行,您可以使用localhost:9200,基于JSON的REST API與ElasticSearch進(jìn)行通信。使用任何HTTP客戶端來(lái)通信。在ElasticSearch自己的文檔中,所有示例都使用curl。 但是,當(dāng)使用API時(shí)也可使用圖形客戶端(如FiddlerRESTClient),這樣操作起更方便直觀一些。

更方便的是Chrome插件Sense。 Sense提供了一個(gè)專門用于使用ElasticSearch的REST API的簡(jiǎn)單用戶界面。 它還具有許多方便的功能,例如:ElasticSearch的查詢語(yǔ)法的自動(dòng)完成功能以及curl格式的復(fù)制和粘貼請(qǐng)求,從而可以方便地在文檔中運(yùn)行示例。

我們將在本教程中使用sense來(lái)執(zhí)行curl請(qǐng)求,建議安裝Sense并使用它學(xué)習(xí)后續(xù)文章內(nèi)容。

安裝完成后,在Chrome的右上角找到Sense的圖標(biāo)。 第一次單擊它運(yùn)行Sense時(shí),會(huì)為您準(zhǔn)備一個(gè)非常簡(jiǎn)單的示例請(qǐng)求。如下圖所示 -


上述請(qǐng)求將執(zhí)行最簡(jiǎn)單的搜索查詢,匹配服務(wù)器上所有索引中的所有文檔。針對(duì)ElasticSearch運(yùn)行,Sense提供的最簡(jiǎn)單的查詢,在響應(yīng)結(jié)果的數(shù)據(jù)中并沒有查詢到任何數(shù)據(jù),因?yàn)闆]有任何索引。如下所示 -

{
   "took": 1,
   "timed_out": false,
   "_shards": {
      "total": 0,
      "successful": 0,
      "failed": 0
   },
   "hits": {
      "total": 0,
      "max_score": 0,
      "hits": []
   }
}

下一步我們來(lái)學(xué)習(xí)添加一些數(shù)據(jù)和索引,來(lái)修復(fù)這個(gè)問題。

文檔管理(CRUD)

想要使用ElasticSearch,用于搜索第一步就是使用一些數(shù)據(jù)填充來(lái)索引,CRUD表“創(chuàng)建”或者“索引”。我們還將學(xué)習(xí)如何更新,讀取和刪除文檔。

創(chuàng)建索引

在ElasticSearch索引中,對(duì)應(yīng)于CRUD中的“創(chuàng)建”和“更新” - 如果對(duì)具有給定類型的文檔進(jìn)行索引,并且要插入原先不存在的ID。 如果具有相同類型和ID的文檔已存在,則會(huì)被覆蓋。

要索引第一個(gè)JSON對(duì)象,我們對(duì)REST API創(chuàng)建一個(gè)PUT請(qǐng)求到一個(gè)由索引名稱,類型名稱和ID組成的URL。 也就是:http://localhost:9200/<index>/<type>/[<id>]。

索引和類型是必需的,而id部分是可選的。如果不指定IDElasticSearch會(huì)為我們生成一個(gè)ID。 但是,如果不指定id,應(yīng)該使用HTTP的POST而不是PUT請(qǐng)求。

索引名稱是任意的。如果服務(wù)器上沒有此名稱的索引,則將使用默認(rèn)配置來(lái)創(chuàng)建一個(gè)索引。

至于類型名稱,它也是任意的。 它有幾個(gè)用途,包括:

  • 每種類型都有自己的ID空間。
  • 不同類型具有不同的映射(“模式”,定義屬性/字段應(yīng)如何編制索引)。
  • 搜索多種類型是可以的,并且也很常見,但很容易搜索一種或多種指定類型。

現(xiàn)在我們來(lái)索引一些內(nèi)容! 可以把任何東西放到索引中,只要它可以表示為單個(gè)JSON對(duì)象。 在本教程中,使用索引和搜索電影的一個(gè)示例。這是一個(gè)經(jīng)典的電影對(duì)象信息:

{
    "title": "The Godfather",
    "director": "Francis Ford Coppola",
    "year": 1972
}

要?jiǎng)?chuàng)建一個(gè)索引,這里使用索引的名稱為“movies”,類型名稱(“movie”)和id(“1”),并按照上述模式使用JSON對(duì)象在正文中進(jìn)行請(qǐng)求。

curl -XPUT "http://localhost:9200/movies/movie/1" -d'
{
    "title": "The Godfather",
    "director": "Francis Ford Coppola",
    "year": 1972
}'

可以使用curl來(lái)執(zhí)行它,也可以使用Sense。這里使用Sense,可以自己填充URL,方法和請(qǐng)求正文,或者您以復(fù)制上述curl示例,將光標(biāo)置于Sense中的正文字段中寫入上面的Json對(duì)象,然后按點(diǎn)擊綠色小箭頭來(lái)執(zhí)行創(chuàng)建索引操作。如下圖所示 -

執(zhí)行請(qǐng)求后,可以看到接收到來(lái)自ElasticSearch響應(yīng)的JSON對(duì)象。如下所示 -

{
   "_index": "movies",
   "_type": "movie",
   "_id": "1",
   "_version": 1,
   "result": "created",
   "_shards": {
      "total": 2,
      "successful": 1,
      "failed": 0
   },
   "created": true
}

響應(yīng)對(duì)象包含有關(guān)索引操作的信息,例如它是否成功(“ok”)和文檔ID,如果不指定則ElasticSearch會(huì)自己生成一個(gè)。

如果運(yùn)行Sense提供的默認(rèn)搜索請(qǐng)求(可以使用Sense中的“歷史記錄”按鈕訪問,因?yàn)榇_實(shí)已執(zhí)行它)過了,就會(huì)看到返回有數(shù)據(jù)的結(jié)果。

{
   "took": 146,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 1,
      "max_score": 1,
      "hits": [
         {
            "_index": "movies",
            "_type": "movie",
            "_id": "1",
            "_score": 1,
            "_source": {
               "title": "The Godfather",
               "director": "Francis Ford Coppola",
               "year": 1972
            }
         }
      ]
   }
}

在上面返回結(jié)果中,看到的是搜索結(jié)果而不是錯(cuò)誤或是空的結(jié)果。

更新索引

現(xiàn)在,在索引中有了一部電影信息,接下來(lái)來(lái)了解如何更新它,添加一個(gè)類型列表。要做到這一點(diǎn),只需使用相同的ID索引它。使用與之前完全相同的索引請(qǐng)求,但類型擴(kuò)展了JSON對(duì)象。

curl -XPUT "http://localhost:9200/movies/movie/1" -d'
{
    "title": "The Godfather",
    "director": "Francis Ford Coppola",
    "year": 1972,
    "genres": ["Crime", "Drama"]
}'

ElasticSearch的響應(yīng)結(jié)果與前面的大體上一樣,但有一點(diǎn)區(qū)別,結(jié)果對(duì)象中的_version屬性的值為2,而不是1。響應(yīng)結(jié)果如下 -

{
   "_index": "movies",
   "_type": "movie",
   "_id": "1",
   "_version": 2,
   "result": "updated",
   "_shards": {
      "total": 2,
      "successful": 1,
      "failed": 0
   },
   "created": false
}

版本號(hào)(_version)可用于跟蹤文檔已編入索引的次數(shù)。它的主要目的是允許樂觀的并發(fā)控制,因?yàn)榭梢栽谒饕?qǐng)求中提供一個(gè)版本,如果提供的版本高于索引中的版本,ElasticSearch將只覆蓋文檔內(nèi)容,ID值不變,版本號(hào)自動(dòng)添加。

由ID獲取文檔/索引

上面已經(jīng)學(xué)習(xí)了索引新文檔以及更新存在的文檔。還看到了一個(gè)簡(jiǎn)單搜索請(qǐng)求的示例。如果只是想檢索一個(gè)具有已知ID的索引,一個(gè)方法是搜索索引中的文檔。另一個(gè)簡(jiǎn)單而快速的方法是通過ID,使用GET來(lái)檢索它。

簡(jiǎn)單的做法是向同一個(gè)URL發(fā)出一個(gè)GET請(qǐng)求,URL的ID部分是強(qiáng)制性的。通過ID從ElasticSearch中檢索文檔可發(fā)出URL的GET請(qǐng)求:http://localhost:9200/<index>/<type>/<id>。

使用以下請(qǐng)求嘗試獲取電影信息:

curl -XGET "http://localhost:9200/movies/movie/1" -d''

執(zhí)行結(jié)果如下所示 -


正如下圖所看到的,結(jié)果對(duì)象包含與索引時(shí)所看到的類似的元數(shù)據(jù),如索引,類型和版本信息。 最后最重要的是,它有一個(gè)名稱為“_source”的屬性,它包含實(shí)際獲取的文檔信息。

關(guān)于GET沒有什么可說(shuō)的,因?yàn)樗芎?jiǎn)單,繼續(xù)最后刪除操作。

刪除文檔

為了通過ID從索引中刪除單個(gè)指定的文檔,使用與獲取索引文檔相同的URL,只是這里將HTTP方法更改為DELETE

curl -XDELETE "http://localhost:9200/movies/movie/1" -d''

響應(yīng)對(duì)象包含元數(shù)據(jù)方面的一些常見數(shù)據(jù)字段,以及名為“_found”的屬性,表示文檔確實(shí)已找到并且操作成功。

在執(zhí)行DELETE調(diào)用后切換回GET,可以驗(yàn)證文檔是否確實(shí)已刪除。

搜索

在前面,已經(jīng)介紹了在ElasticSearch索引中處理數(shù)據(jù)的基礎(chǔ)知識(shí),現(xiàn)在是時(shí)候進(jìn)行核心功能的學(xué)習(xí)了。考慮到之前我們刪除索引中的所有文檔,所以,在進(jìn)行搜索學(xué)習(xí)之前,需要一些添加一些示例數(shù)據(jù)。使用以下這些請(qǐng)求和數(shù)據(jù)對(duì)象來(lái)創(chuàng)建索引。

curl -XPUT "http://localhost:9200/movies/movie/1" -d'
{
    "title": "The Godfather",
    "director": "Francis Ford Coppola",
    "year": 1972,
    "genres": ["Crime", "Drama"]
}'

curl -XPUT "http://localhost:9200/movies/movie/2" -d'
{
    "title": "Lawrence of Arabia",
    "director": "David Lean",
    "year": 1962,
    "genres": ["Adventure", "Biography", "Drama"]
}'

curl -XPUT "http://localhost:9200/movies/movie/3" -d'
{
    "title": "To Kill a Mockingbird",
    "director": "Robert Mulligan",
    "year": 1962,
    "genres": ["Crime", "Drama", "Mystery"]
}'

curl -XPUT "http://localhost:9200/movies/movie/4" -d'
{
    "title": "Apocalypse Now",
    "director": "Francis Ford Coppola",
    "year": 1979,
    "genres": ["Drama", "War"]
}'

curl -XPUT "http://localhost:9200/movies/movie/5" -d'
{
    "title": "Kill Bill: Vol. 1",
    "director": "Quentin Tarantino",
    "year": 2003,
    "genres": ["Action", "Crime", "Thriller"]
}'

curl -XPUT "http://localhost:9200/movies/movie/6" -d'
{
    "title": "The Assassination of Jesse James by the Coward Robert Ford",
    "director": "Andrew Dominik",
    "year": 2007,
    "genres": ["Biography", "Crime", "Drama"]
}'

值得指出的是,ElasticSearch具有和端點(diǎn)(_bulk)用于用單個(gè)請(qǐng)求索引多個(gè)文檔,但是這超出了本教程的范圍,這里只保持簡(jiǎn)單,使用六個(gè)單獨(dú)的請(qǐng)求學(xué)習(xí)。

_search端點(diǎn)

現(xiàn)在已經(jīng)把一些電影信息放入了索引,可以通過搜索看看是否可找到它們。 為了使用ElasticSearch進(jìn)行搜索,我們使用_search端點(diǎn),可選擇使用索引和類型。也就是說(shuō),按照以下模式向URL發(fā)出請(qǐng)求:<index>/<type>/_search。其中,indextype都是可選的。

換句話說(shuō),為了搜索電影,可以對(duì)以下任一URL進(jìn)行POST請(qǐng)求:

因?yàn)槲覀冎挥幸粋€(gè)單一的索引和單一的類型,所以怎么使用都不會(huì)有什么問題。為了簡(jiǎn)潔起見使用第一個(gè)URL。

搜索請(qǐng)求正文和ElasticSearch查詢DSL

如果只是發(fā)送一個(gè)請(qǐng)求到上面的URL,我們會(huì)得到所有的電影信息。為了創(chuàng)建更有用的搜索請(qǐng)求,還需要向請(qǐng)求正文中提供查詢。 請(qǐng)求正文是一個(gè)JSON對(duì)象,除了其它屬性以外,它還要包含一個(gè)名稱為“query”的屬性,這就可使用ElasticSearch的查詢DSL。

{
    "query": {
        //Query DSL here
    }
}

你可能想知道查詢DSL是什么。它是ElasticSearch自己基于JSON的域特定語(yǔ)言,可以在其中表達(dá)查詢和過濾器。想象ElasticSearch它像關(guān)系數(shù)據(jù)庫(kù)的SQL。這里是ElasticSearch自己的文檔解釋它的一部分(英文好自己擼吧):

Think of the Query DSL as an AST of queries. Certain queries can contain other queries (like the bool query), other can contain filters (like the constant_score), and some can contain both a query and a filter (like the filtered). Each of those can contain any query of the list of queries or any filter from the list of filters, resulting in the ability to build quite complex (and interesting) queries. see more: http://www.elasticsearch.org/guide/reference/query-dsl/

基本自由文本搜索

查詢DSL具有一長(zhǎng)列不同類型的查詢可以使用。 對(duì)于“普通”自由文本搜索,最有可能想使用一個(gè)名稱為“查詢字符串查詢”。

查詢字符串查詢是一個(gè)高級(jí)查詢,有很多不同的選項(xiàng),ElasticSearch將解析和轉(zhuǎn)換為更簡(jiǎn)單的查詢樹。如果忽略了所有的可選參數(shù),并且只需要給它一個(gè)字符串用于搜索,它可以很容易使用。

現(xiàn)在嘗試在兩部電影的標(biāo)題中搜索有“kill”這個(gè)詞的電影信息:

curl -XPOST "http://localhost:9200/_search" -d'
{
    "query": {
        "query_string": {
            "query": "kill"
        }
    }
}'

執(zhí)行上面的請(qǐng)求并查看結(jié)果,如下所示 -

正如預(yù)期的,得到兩個(gè)命中結(jié)果,每個(gè)電影的標(biāo)題中都帶有“kill”單詞。再看看另一種情況,在特定字段中搜索。

指定搜索的字段

在前面的例子中,使用了一個(gè)非常簡(jiǎn)單的查詢,一個(gè)只有一個(gè)屬性“query”的查詢字符串查詢。 如前所述,查詢字符串查詢有一些可以指定設(shè)置,如果不使用,它將會(huì)使用默認(rèn)的設(shè)置值。

這樣的設(shè)置稱為“fields”,可用于指定要搜索的字段列表。如果不使用“fields”字段,ElasticSearch查詢將默認(rèn)自動(dòng)生成的名為“_all”的特殊字段,來(lái)基于所有文檔中的各個(gè)字段匹配搜索。

為了做到這一點(diǎn),修改以前的搜索請(qǐng)求正文,以便查詢字符串查詢有一個(gè)fields屬性用來(lái)要搜索的字段數(shù)組:

curl -XPOST "http://localhost:9200/_search" -d'
{
    "query": {
        "query_string": {
            "query": "ford",
            "fields": ["title"]
        }
    }
}'

執(zhí)行上面查詢它,看看會(huì)有什么結(jié)果(應(yīng)該只匹配到 1 行數(shù)據(jù)):

正如預(yù)期的得到一個(gè)命中,電影的標(biāo)題中的單詞“ford”?,F(xiàn)在,從查詢中移除fields屬性,應(yīng)該能匹配到 3 行數(shù)據(jù):

過濾

前面已經(jīng)介紹了幾個(gè)簡(jiǎn)單的自由文本搜索查詢?,F(xiàn)在來(lái)看看另一個(gè)示例,搜索“drama”,不明確指定字段,如下查詢 -

curl -XPOST "http://localhost:9200/_search" -d'
{
    "query": {
        "query_string": {
            "query": "drama"
        }
    }
}'

因?yàn)樵谒饕杏形宀侩娪霸?code>_all字段(從類別字段)中包含單詞“drama”,所以得到了上述查詢的5個(gè)命中。 現(xiàn)在,想象一下,如果我們想限制這些命中為只是1962年發(fā)布的電影。要做到這點(diǎn),需要應(yīng)用一個(gè)過濾器,要求“year”字段等于1962

要添加過濾器,修改搜索請(qǐng)求正文,以便當(dāng)前的頂級(jí)查詢(查詢字符串查詢)包含在過濾的查詢中:

{
    "query": {
        "filtered": {
            "query": {
                "query_string": {
                    "query": "drama"
                }
            },
            "filter": {
                //Filter to apply to the query
            }
        }
    }
}

過濾的查詢是具有兩個(gè)屬性(queryfilter)的查詢。執(zhí)行時(shí),它使用過濾器過濾查詢的結(jié)果。要完成這樣的查詢還需要添加一個(gè)過濾器,要求year字段的值為1962。

ElasticSearch查詢DSL有各種各樣的過濾器可供選擇。對(duì)于這個(gè)簡(jiǎn)單的情況,某個(gè)字段應(yīng)該匹配一個(gè)特定的值,一個(gè)條件過濾器就能很好地完成工作。

"filter": {
    "term": { "year": 1962 }
}

完整的搜索請(qǐng)求如下所示:

curl -XPOST "http://localhost:9200/_search" -d'
{
    "query": {
        "filtered": {
            "query": {
                "query_string": {
                    "query": "drama"
                }
            },
            "filter": {
                "term": { "year": 1962 }
            }
        }
    }
}'

當(dāng)執(zhí)行上面請(qǐng)求,只得到兩個(gè)命中,這個(gè)兩個(gè)命中的數(shù)據(jù)的 year 字段的值都是等于 1962。

無(wú)需查詢即可進(jìn)行過濾

在上面的示例中,使用過濾器限制查詢字符串查詢的結(jié)果。如果想要做的是應(yīng)用一個(gè)過濾器呢? 也就是說(shuō),我們希望所有電影符合一定的標(biāo)準(zhǔn)。

在這種情況下,我們?nèi)匀辉谒阉髡?qǐng)求正文中使用“query”屬性。但是,我們不能只是添加一個(gè)過濾器,需要將它包裝在某種查詢中。

一個(gè)解決方案是修改當(dāng)前的搜索請(qǐng)求,替換查詢字符串 query 過濾查詢中的match_all查詢,這是一個(gè)查詢,只是匹配一切。類似下面這個(gè):

curl -XPOST "http://localhost:9200/_search" -d'
{
    "query": {
        "filtered": {
            "query": {
                "match_all": {
                }
            },
            "filter": {
                "term": { "year": 1962 }
            }
        }
    }
}'

另一個(gè)更簡(jiǎn)單的方法是使用常數(shù)分?jǐn)?shù)查詢:

curl -XPOST "http://localhost:9200/_search" -d'
{
    "query": {
        "constant_score": {
            "filter": {
                "term": { "year": 1962 }
            }
        }
    }
}'

參考:http://www.yiibai.com/elasticsearch/elasticsearch-getting-start.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容