0

複合フィールドを Lucene クエリに適用する関数の実装に問題があります。

lucene クエリを入力する代わりに:

title:「正しい道」 subject:「正しい道」

ユーザーが次のように入力できるようにしたい:

all:「正しい道」

all は、実際のフィールド title と subject で構成される複合フィールドです。この関数は、複合フィールドの構成要素が展開された有効な lucene クエリを生成する必要があります。

文字列クエリ = applyCompositeFields(文字列クエリ、文字列複合フィールド、文字列[] サブフィールド) {

提供されたクエリは、lucene クエリ構文に従った任意のクエリです ( http://lucene.apache.org/core/old_versioned_docs/versions/3_0_0/queryparsersyntax.html#Range%20Searchesを参照) 。

例えば:

all:[20020101 ~ 20030101]

次のように拡張する必要があります。

件名:[20020101 ~ 20030101] 件名:[20020101 ~ 20030101]

複雑なクエリ入力を壊さずにこれをきちんと行う方法についてのアイデアはありますか?

Lucene クエリ オブジェクト モデルを使用してみましたが、クエリ要素にフィールド名を設定できないため、役に立ちません。

4

1 に答える 1

0

MultiFieldQueryParserはあなたが探しているものだと思います。

編集

MultiFieldQueryParser は次のことを行います。

  • フィールドがクエリ文字列で明示されていない場合、複数のフィールド間でクエリをディスパッチします ( "The Right Way")
  • それ以外の場合は、単一のフィールドに対して通常のクエリを使用します ( title:"The Right Way")。

例えば、

    MultiFieldQueryParser qp = new MultiFieldQueryParser(
            Version.LUCENE_36, new String[] { "subject", "body" },
            new KeywordAnalyzer());
    System.out.println(qp.parse("subject:\"hello\" body:test AND [1222 TO 2333]"));

版画

    subject:hello +body:test +(subject:[1222 TO 2333] body:[1222 TO 2333])

仮想複合フィールドを使用して独自の構文に固執したい場合はall、QueryParser を拡張して、フィールド名がall. MultiFieldQueryParserのソース コードを見て、インスピレーションを得ることができます。

于 2012-05-10T12:29:08.170 に答える