2013-07-26 150 views
1

我目前正試圖通過庫elasticutils在現有ElasticSearch實例中使用filter。不幸的是,我無處可去。我不確定問題是因爲我做了一些基本錯誤還是圖書館存在問題(很可能是AFAICT)。ElasticSearch通過elasticutils過濾器

我得到了一個具有特定映射的索引,其中包含字符串類型(沒有給出明確的分析器)的字段(稱爲「A」)。該字段總是包含一個字符串列表。

我想通過包含在該領域的一個給定的字符串來過濾我的文檔,所以我嘗試:

import elasticutils as eu 
es = eu.S().es(urls=[ URL ]).indexes(INDEX).doctypes(DOCTYPE) 
f = eu.F(A="text") 
result = es.filter(f) 

但返回一個空結果集。我也嘗試過使用f = eu.F(A__in="text"),但是這導致了一個很大的錯誤信息,最有趣的部分是[terms] filter does not support [A]

我想知道如果我必須以不同的方式配置我的索引,也許我必須創建一個方面才能使用過濾器?但是在我讀的文檔中我沒有發現任何提示。

我想要使用filter的理由是,他們可以自由組合使用and,ornot。我還發現一些規格說明query也可以是布爾值,但它們通常指的是must,shouldmust_not,這些對我來說不夠靈活。但是我也發現了一些提到了operator標誌的規格query,它可以設置爲andor。任何信息都是值得歡迎的。

所以,我的問題現在:

  • 它是一個配置問題?這個方面有什麼關係?
  • 我想通過跳過lib來測試這是否是一個庫錯誤,那麼如何使用curl來執行這個過濾操作?或任何其他圖書館(也許pyes)?
  • 是可能的幾個查詢(即根本不使用過濾器)的靈活組合(使用and,or,not及其組合)?我會怎麼做? (最好在elasticutils中,但其他庫語法,例如pyes或簡單的CURL也是受歡迎的)。
+1

我可以建議您查看適用於Chrome的Sense插件(https://chrome.google.com/webstore/detail/sense/doinijnbnggojdlcjifpdckfokbbfpbo?hl=en)嗎?這是使用ES羣集而不是CURL的強大工具。另外,我建議從pyelasticsearch開始,而不是似乎抽象得太多的東西 - 至少從(http://pyelasticsearch.readthedocs.org/)開始。 :) –

+0

我不知道這個庫很好 - 有沒有辦法看到它用來查詢ES的JSON? – argentage

回答

3

airza用CURL格式對您要查找的過濾器的回答進行了打擊。我懷疑你看到的問題很大程度上是由於使用了一個抽象模塊,如elasticutils - 首先熟悉底層的ES查詢協議是很好的。這將使理解elasticutils更容易。正如在我上面的評論中,我建議安裝谷歌瀏覽器插件'Sense',讓您輕鬆查詢您的ES羣集:https://chrome.google.com/webstore/detail/sense/doinijnbnggojdlcjifpdckfokbbfpbo?hl=en

Elasticsearch查詢過濾器是非常靈活 - 和'可嵌套'。您可以很容易地在boolmust過濾器中嵌入or過濾器。例如:

{ 
    "query": { 
     "filtered": { 
      "query": { 
       "match_all": {} 
      }, 
      "filter": { 
       "bool": { 
        "must": [ 
         { 
          "or": [ 
           {"exists": {"field": "sessions"}}, 
           {"range": {"id": {"gte": 56000}}} 
          ] 
         }, 
         { 
          "term": {"age_min": "13"} 
         } 
        ], 
        "should": [ 
         { 
          "term": {"area": "1"} 
         } 
        ] 
       } 
      } 
     } 
    } 
} 

在這個例子中,結果匹配兩個mustor濾波器中的一個和所述age_minterm濾波器,並且should子句中的areaterm濾波器匹配的項目的排名將高於非匹配項目更高。

+0

感謝您提供詳盡的答案和結合過濾器和查詢的示例,這對我目前非常有幫助。我現在也使用直接捲曲,儘管我不樂意失去'elasticutils'庫提供的所有漂亮的抽象。也許我會發現如何去啓動這個庫,以便它在未來能夠做到我想要的,但是現在我堅持認爲它不能勝任這項任務。 – Alfe

+0

我偏離了抽象(例如django-haystack),轉而採用更像pyelasticsearch這樣的更直接的方式來實現更大的靈活性。抽象是偉大的,直到他們沒有。 :) –

1

解決這個問題捲曲的要求很簡單:

curl -XPOST URL/INDEX/_search? -d '{ 
    "filter": { 
    "term": { 
     "A": "val" 
    } 
    } 
}' 

這裏沒有什麼特別的關係方面(這是用來獲取另一個查詢的各種子集的大小類型的搜索查詢),但如果字段A沒有編入索引,您將無法搜索並找到任何內容。但是,如果是這種情況,你的ES查詢應該只是返回任何記錄(因爲當你查詢非索引字段時,你基本上給ES沒有特定的過濾指令)

查詢吐出了我試圖執行相當於使用這個庫的ES搜索是這樣的:

{'filter': {'term': {'language': 'EN'} 

你可以看到與你跑的一樣。當你調用result.all()時發生了什麼?