0

ブール演算子を使用してワイルドカード検索を実行しようとしています。次のクエリを実行すると、適切な結果が得られます:-

q=field1:*val1 val2* AND field2:val3

上記は、val1 と val2 が任意の組み合わせで field1 に出現し、field2 に値 val3 が含まれるすべてのレコードを表示します。

ただし、次のクエリを実行すると:-

q=field1:*val1 val2* AND field2:val3 AND -field3:(*val1 val2* *:*)

field1 検索の動作がおかしくなり始めます。私が debugQuery の結果を理解している限り、上記のクエリは、最初に val1 または val2 (または両方) が field1 に表示されるレコードを検索し、field2 でフィルター処理してから、field3に val1 と val1の組み合わせが含まれていないレコードをフィルター処理します。 val2。したがって、このクエリは、field1 に val2 (val1 ではなく) が存在するレコードを表示できます。

field1でも近接検索を試みました。無効。ただし、後で、近接検索はワイルドカードでは機能しないことを知りました。

上記のフィールドは次のように定義されています:-

<field name="field1" type="text_general" indexed="true" stored="false" multiValued="true" />
<field name="field2" type="text_general" indexed="true" stored="false" />


<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="select">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>

    </fieldType>

field3 は文字列であり、問​​題はありません。上記のクエリを変更して、field1 を検索すると、val1 と val2 の両方が存在するレコードのみが返されるようにすることはできますか (任意の組み合わせが許容されます)。

更新:次のことを行ったときに機能しました:-

q=field1:*val1 AND field1:val2* AND field2:val3 AND -field3:(*val1 val2* *:*)

しかし、私のフレーズを個々の単語に切り刻むことなく、同じことを達成する方法はありますか?

4

1 に答える 1

1

あなたはこう言います:

field1:*val1 val2*

val1 と val2 の両方の検索が発生します。この構文を自分で実装したことがない限り、Lucene または Solr でそのような構文のドキュメントを見つけることはできません。以下を検索する必要があります。

field1:*val1 OR defaultfield:val2*

field1 で両方の存在を検索したい場合 (ワイルドカードで何を達成しようとしているのかはわかりませんが、当面はそのままにしておきます):

field1:(+*val1 +val2*)

また、、またはの-field3:(*val1 val2* *:*)いずれかを含むすべての結果を省略することを意味し、最後にコロンを含むものとして読みましたが、正しく機能するかどうかはわかりません。*val1val2**:*

field1:(*val1 AND val2*) AND field2:val3 AND -field3:(*val1 val2* *:*)

または(少なくとも、代替として好みのクエリ構文を提供する必要があるため):

+field1:(+*val1 +val2*) +field2:val3 -field3:(*val1 val2* *:*)
于 2013-01-31T17:09:15.090 に答える