9

I am new to ElasticSearch and Couchbase. I am building a sample Java application to learn more about ElasticSearch and Couchbase.

Reading the ElasticSearch Java API, Filters are better used in cases where sort on score is not necessary and for caching. I still haven't figured out how to use FilterBuilders and have following questions:

  • Can FilterBuilders be used alone to search?
  • Or Do they always have to be used with a Query? ( If true, can someone please list an example? )
  • Going through a documentation, if I want to perform a search based on field values and want to use FilterBuilders, how can I accomplish that? (using AndFilterBuilder or TermFilterBuilder or InFilterBuilder? I am not clear about the differences between them.)

For the 3rd question, I actually tested it with search using queries and using filters as shown below. I got empty result (no rows) when I tried search using FilterBuilders. I am not sure what am I doing wrong.

Any examples will be helpful. I have had a tough time going through documentation which I found sparse and even searching led to various unreliable user forums.

private void processQuery() {
        SearchRequestBuilder srb = getSearchRequestBuilder(BUCKET);
        QueryBuilder qb = QueryBuilders.fieldQuery("doc.address.state", "TX");
        srb.setQuery(qb);

        SearchResponse resp = srb.execute().actionGet();
        System.out.println("response :" + resp);
    }

private void searchWithFilters(){
        SearchRequestBuilder srb = getSearchRequestBuilder(BUCKET);
        srb.setFilter(FilterBuilders.termFilter("doc.address.state", "tx"));
        //AndFilterBuilder andFb = FilterBuilders.andFilter();
        //andFb.add(FilterBuilders.termFilter("doc.address.state", "TX")); 
        //srb.setFilter(andFb);
        SearchResponse resp = srb.execute().actionGet();
        System.out.println("response :" + resp);
    }

--UPDATE--

As suggested in the answer, changing to lowercase "tx" works. With this question resolved. I still have following questions:

  • In what scenario(s), are filters used with query? What purpose will this serve?
  • Difference between InFilter, TermFilter and MatchAllFilter. Any illustration will help.
4

3 に答える 3

11

そうです、フィルターを使用して、クエリの実行時にドキュメントが考慮されないようにする必要があります。フィルターはスコアリングを伴わないため高速であり、キャッシュも可能です。

そうは言っても、クエリを実行し、オプションのフィルターを受け入れるsearch apiでフィルターを使用する必要があることは明らかです。フィルターしかない場合は、フィルターと一緒にmatch_allクエリを使用できます。フィルターは単純なものにすることも、複数のフィルターを組み合わせるために複合フィルターにすることもできます。

Java APIに関しては、使用される名前は使用可能なフィルターの名前であり、大きな違いはありません。たとえば、この検索例を見てください。setFilterあなたのコードでは、SearchRequestBuilderオブジェクトのどこで何をしているのかわかりません。単一のフィルターを使用しているため、 and フィルターも必要ないようです。さらに、デフォルトのマッピングを使用してインデックスを作成している可能性があるため、「TX」という用語は小文字になっています。そのため、用語フィルターを使用して検索しても、一致するものは見つかりません。小文字の「tx」を検索してみてください。

インデックス作成中に「TX」用語をそのまま保持したい場合は、マッピングを変更できます。おそらく、フィールドをnot_analyzed単一のトークンのみであるかのように設定します。それ以外の場合はフィルターを変更できます。コンテンツがインデックス化されたのと同じ方法でクエリが分析されるように、分析されたクエリを確認することをお勧めします。

クエリとフィルターの詳細については、クエリ DSL のドキュメントを参照してください。

  • MatchAllFilter:すべてのドキュメントに一致しますが、それほど役に立ちません
  • TermFilter: 用語を含むフィールドを持つドキュメントをフィルタリングします (分析されません)。
  • AndFilter: 2 つ以上のフィルターを入れるために使用される複合フィルター

の意味がInFilterBuilderわかりません。この名前のフィルタは見つかりませんでした。

通常、クエリには、ユーザーがテキスト検索ボックスに入力した内容が含まれます。フィルターは、たとえばファセット エントリをクリックするなど、検索を絞り込むためのより多くの方法です。そのため、クエリと 1 つ以上のフィルターを引き続き使用できます。

于 2013-05-10T18:14:09.150 に答える
2

他の回答に追加するために、InFilter は FilterBuilders でのみ使用されます。定義は、InFilter: いずれかの用語に一致する複数の用語に基づくフィールドのフィルタです。

クエリ Java API は、Java コードからクエリを動的に作成できるフィルタ ビルダーのファクトリである FilterBuilders を使用します。フォームを使用してこれを行い、チェックボックス、オプション、およびドロップダウンを使用して、フォームからのユーザーの選択に基づいてクエリを作成します。

ここに FilterBuilders のサンプル コードがいくつかあります。以下に示すように、InFilter を使用するそのリンクからのスニペットがあります。

FilterBuilder filterBuilder;
    User user = (User) auth.getPrincipal();
    if (user.getGroups() != null && !user.getGroups().isEmpty()) {
        filterBuilder = FilterBuilders.boolFilter()
                .should(FilterBuilders.nestedFilter("userRoles", FilterBuilders.termFilter("userRoles.key", auth.getName())))
                .should(FilterBuilders.nestedFilter("groupRoles", FilterBuilders.inFilter("groupRoles.key", user.getGroups().toArray())));
    } else {
        filterBuilder = FilterBuilders.nestedFilter("userRoles", FilterBuilders.termFilter("userRoles.key", auth.getName()));
    }
    ...
于 2016-03-04T18:39:28.080 に答える