1

filter現在、ライブラリを介して既存の ElasticSearch インスタンスでa を使用しようとしていますelasticutils。残念ながら、私はどこにも行きません。問題が基本的な間違いを犯したためなのか、それともライブラリに問題があるのか​​ どうかはわかりません(AFAICTの可能性があります)。

文字列型のフィールド(「A」など)を含む特定のマッピングを持つインデックスを取得しました(明示的なアナライザーは指定されていません)。そのフィールドには常に文字列のリストが含まれています。

そのフィールド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自由に組み合わせられるからです。また、これもブール値である可能性があることを説明するいくつかの仕様を見つけましたが、それらは通常、 、、およびを参照していますが、これは私にとって十分な柔軟性がないと思います。しかし、またはに設定できる s のフラグについて言及している仕様もいくつか見つけました。それに関する情報は大歓迎です。andornotquerymustshouldmust_notoperatorqueryandor

だから、私の質問は次のとおりです。

  • 構成の問題ですか?ファセットはこれと関係がありますか?
  • ライブラリをスキップして、これがライブラリのバグかどうかをテストしたいのですが、たとえば、curl だけを使用してこのフィルタリング アクションを実行するにはどうすればよいですか? または他のライブラリ(おそらくpyes)?
  • 複数のクエリを柔軟に組み合わせる ( andor、 、およびそれらのグループ化を使用する) ことは可能ですか (つまり、フィルターをまったく使用しません)? notどうすればいいですか?(できれば、elasticutils他のライブラリ構文、たとえばpyes、または単純な CURL も同様に歓迎されます)。
4

2 に答える 2

1

この問題を解決するための CURL リクエストは非常に簡単です。

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

ここでは、ファセット (別のクエリのさまざまなサブセットのサイズを取得するために使用される検索クエリの一種) との特定の関係はありませんが、フィールド A にインデックスが付けられていない場合、それを検索して何かを見つけることはできません。ただし、この場合、ES クエリは任意のレコードを返す必要があります (インデックスのないフィールドをクエリするときは、基本的に ES に特定のフィルター命令を与えていないため)。

このライブラリを使用して同等の ES 検索を実行しようとしたときに吐き出されたクエリは次のとおりです。

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

あなたが見ることができるのは、あなたが走ったものと同じです。result.all() を呼び出すとどうなりますか?

于 2013-07-29T17:42:09.297 に答える