3

個人的な質問でクエリに問題があり、用語に AND 句を入れたいのですが、取得できず、検索を試みても成功しませんでした。

例に従って、クエリを返します (私は自分の指標で Luke 条件をテストするために使用していますが、結果は異なります)

    builder.bool()  
    .should(builder  
            .bool()  
            .should(builder.keyword()  
                    .onFields("campo01", "campo02", "campo03")  
                    .matching(query).createQuery())  
            .should(builder.keyword().wildcard().onField("campo01")  
                    .matching("*" + query + "*").createQuery())  
            .should(builder.keyword().wildcard().onField("campo02")  
                    .matching("*" + query + "*").createQuery())  
            .should(builder.keyword().wildcard().onField("campo03")  
                    .matching("*" + query + "*").createQuery()).createQuery())  
    .must(builder.keyword().onField("campo04").matching(0).createQuery())  
    .createQuery();

このコードは、次のクエリ lucene を生成します。

(((campo01:teste campo02:test campo03:teste) campo01:*teste* campo02*teste* campo03:*teste*) +campo04:0)

ただし、このクエリは予想よりも大きな結果を返しています。Luke とテストを行った結果、Must は理想的ではなく、AND を配置する必要があることがわかりました。

    (((campo01:teste campo02:test campo03:teste) campo01:*teste* campo02*teste* campo03:*teste*) AND campo04:0)

したがって、結果は正しいですが、この結果を作成するためのビルド クエリを作成できませんでした。

誰でも助けてもらえますか、質問が残っていますか。私が本当に欲しいのは、特定のフィールドに AND 条件を入れることです。

4

1 に答える 1

2

'must' 句と 'should' 句の使用については正しい考えをお持ちです。これらを使用して論理 AND を効果的に作成するクエリを作成できます。あなたは一つのことを見逃しています。次のような AND の構造。

query1 AND query2

だろう:

+query1 +query2

たとえば、最初のクエリで「+」または Must 句が欠落しているため、2 番目のクエリは必要ですが、最初のクエリは必要ありませんが、結果の重みに影響します。

つまり、具体的には、あなたが望むのは

builder.bool()  
.must(builder  
        .bool()  
        .should(builder.keyword()  
                .onFields("campo01", "campo02", "campo03")  
                .matching(query).createQuery())  
        .should(builder.keyword().wildcard().onField("campo01")  
                .matching("*" + query + "*").createQuery())  
        .should(builder.keyword().wildcard().onField("campo02")  
                .matching("*" + query + "*").createQuery())  
        .should(builder.keyword().wildcard().onField("campo03")  
                .matching("*" + query + "*").createQuery()).createQuery())  
.must(builder.keyword().onField("campo04").matching(0).createQuery())  
.createQuery();

または...

(+((campo01:teste campo02:test campo03:teste) campo01:*teste* campo02*teste* campo03:*teste*) +campo04:0)
于 2012-10-08T17:53:58.817 に答える