0

SOLR 検索エンジンを使用しています。

数日前、特定の列に対して同様の操作を実行するための要件を思いつきました。

例えば:

Column name: Name

Content: Stackoverflow is good.

クエリは

Name:("*overflow is*")

このクエリは、具体的な 「Stackoverflow が優れている」ことを示しているはずです。結果として

この入力パラメーターは、入力全体と見なす必要があります。これは、フリー テキスト検索と見なされるべきではありません。SQL では「like」操作として機能するはずです。

そのため、この構成を使用しています。

<fieldtype class="solr.TextField" name="string_wildcards" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.TrimFilterFactory" />
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.TrimFilterFactory" />
        <filter class="solr.KeywordTokenizerFactory"/>
      </analyzer>
    </fieldtype>

このクエリは、「like」操作から期待どおりの結果を返してくれません。

例: 名前:("オーバーフローは")

'LIKE' 演算子ではなく、FREE TEXT として検索します。

それは私に結果を与える

  1. オーバーフローとは。
  2. 私の名前はABCです
  3. オーバーフローとは
  4. スタックオーバーフローは良いです。

私の予想される結果はポイント 4 のみです。上記の構成では 4 つの結果すべてが得られますが、これは間違っています。

私の要件に合った正しい構成を教えてください。

4

2 に答える 2

1

ポイントは、StandardTokenizerFactory で入力を分割/トークン化することです。この場合、 と を検索し*overflowますis*

ただし、次のような左側のワイルドカード文字

*オーバーフロー

デフォルトでは、solr ではサポートされていません。その場合、フィールド (列) の「名前」に 2 回インデックスを付ける必要があります。

つまり、タイプ string_wildcards からファイル名を追加します。2 番目のフィールドを追加したように、タイプ left_wildcards_string からそれを呼び出しますeman(逆: 名前)。この fieldtype-definition で、solr.ReversedWildcardFilterFactoryを追加します

最後に、検索範囲を両方のフィールドに広げます。

于 2012-07-17T13:03:38.267 に答える
0

キーワード間のデフォルトのブール値パラメーターは OR です。これが、4 つの結果すべてを取得する理由です。

于 2013-07-14T12:11:43.053 に答える