1

私は現在、Solrのかなり単純な実装であると(誤って)考えていたものを使用していますNGramTokenizerFactoryが、管理アナライザーと実際のクエリ結果の間で一貫性のない奇妙な結果が得られており、いくつかのガイダンスを期待しています。

NGram(minGramSize = 2、maxGramSize = 2)インデックスに一致するユーザー入力を取得しようとしています。インデックス作成とクエリ時間のスキーマは次のとおりです。

  1. を使用して、英数字以外のすべての文字を削除しPatternReplaceCharFilterます。
  2. でトークン化しNGramTokenizerFactoryます。
  3. 私は小文字を使用してLowerCaseFilterFactoryいます(これにより、文字以外のトークンがそのまま残るため、番号は残ります)。

以下のスキーマを使用すると、「PCB-1260」(適切にエスケープされたダッシュ付き)の検索は、「Arochlor-1260」のインデックス化されたトークン化された小文字の値と一致する必要があると思います(つまり、1260のバイグラムは「1226」です。インデックス値とクエリ値の両方で60")。

残念ながら、ダッシュを削除しないと結果が得られません。[編集-ダッシュを適切にエスケープしてクエリに残しても、結果は得られません]。-を使用してすべての英数字を完全にパターン置換しているため、これは奇妙に思えPatternReplaceCharFilterます。これにより、すべての空白とダッシュが削除されると思います。

管理ページのクエリアナライザは、以下のスキーマを使用して適切な一致を示しています-そのため、私は少し途方に暮れています。私がここで見逃している 、PatternReplaceCharFilterまたはについての基本的な何かがありますか?NGramTokenizerFactory

コードや他の投稿を確認しましたが、これを理解できないようです。壁に頭をぶつけて1週間後、これをスタックの権限に提出します。

<fieldtype name="tokentext" class="solr.TextField" positionincrementgap="100">
    <analyzer type="index">
        <charfilter class="solr.PatternReplaceCharFilterFactory" pattern="([^A-Za-z0-9])" replacement=""/>
        <tokenizer class="solr.NGramTokenizerFactory" mingramsize="2" maxgramsize="2"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <charfilter class="solr.PatternReplaceCharFilterFactory" pattern="[^A-Za-z0-9]" replacement=""/>
        <tokenizer class="solr.NGramTokenizerFactory" mingramsize="2" maxgramsize="2"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldtype>
4

1 に答える 1

0

つまり、PatternReplaceCharFilterがクエリ時にダッシュを削除できないというのは間違いなく奇妙なことです。最終的には、Solrに送信する前に、preg_replaceを使用してユーザー入力のphpで事前クエリ処理を実行しました。-期待通りの結果が得られた魅力のように機能しました。PatternReplaceCharFilterが動作していなかったことに戸惑う...

これは、ダッシュを削除するために使用したクエリ前のphpコードです。

$pattern = '/([-])/';
$replacement = ' ';
$usrpar = preg_replace($pattern, $replacement, $raw_user_search_contents);
$res = htmlentities($usrpar, ENT_QUOTES, 'utf-8');

その後、$resをSolrに渡しました...

于 2011-07-08T18:38:56.453 に答える