0

正常にクエリできる Lucene インデックスのセットアップがあります。「フィールドが空の文字列と等しくない」という条件を機能させることができません。たとえば、以下のコード例では、3 つの条件が必要です

  1. 「国タグ」フィールドには「{4ED2F7EE-5C2A-418C-B2F6-236F94166BA1}」が含まれます。
  2. 「国タグ」フィールドは空の文字列ではありません。
  3. 「日付」の範囲は「20110101T000000」から「20121001T000000」までです。

        WildcardQuery taggingQuery = new WildcardQuery(new Term("country tag", "*" + ShortID.Encode("{4ED2F7EE-5C2A-418C-B2F6-236F94166BA1}").ToLowerInvariant() + "*"));
        TermQuery taggingNotQuery = new Term("country tag", " "));
    
        RangeQuery rangeQuery = new RangeQuery(new Term("date", "20110101T000000"), new Term("date", "20121001T000000"), true);
    
        BooleanQuery booleanQuery = new BooleanQuery();
        booleanQuery.Add(taggingQuery, BooleanClause.Occur.MUST);
        booleanQuery.Add(taggingNotQuery, BooleanClause.Occur.MUST_NOT);
        booleanQuery.Add(rangeQuery, BooleanClause.Occur.MUST);
    

私はこれを間違っているか、クエリが何らかの形で間違っていると感じています。空のフィールドまたは null フィールドに注意する必要がある条件は必要ありません。

どんな助けでも大歓迎です!

4

2 に答える 2

0

検索文字列の最初の文字として「*」を許可すると、Lucene は「countrytag:*」などのクエリを使用して、countrytagフィールドに何かを含むすべてのドキュメントを検索できます。(Lucene のデフォルトでは、クエリ文字列の最初の '*' は無効になっています。)

于 2012-11-07T23:39:55.107 に答える
0

インデックスを設定するときは、もっと注意を払うべきでした。各フィールドにフィールド アナライザーを追加するのを忘れていました。マルチリスト フィールドは、標準のアナライザーではなく別のアナライザーでインデックス化されていました。これをフィールドクロールの設定セクションに追加すると、クエリが機能し始めました

<fieldTypes hint="raw:AddFieldTypes">
                  <!-- Text fields need to be tokenized -->
                  <fieldType name="single-line text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="multi-line text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="word document" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="html" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="rich text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="memo" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <!-- Multilist based fields need to be tokenized to support search of multiple values -->
                  <fieldType name="multilist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="treelist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="treelistex" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="checklist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <!-- Legacy tree list field from ver. 5.3 -->
                  <fieldType name="tree list" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                </fieldTypes>
于 2012-11-08T14:28:06.050 に答える