2016-12-15 82 views
0

クエリの部分文字列に一致する必要がある部分があります。 例えば、フィールドに値がある場合:solrクエリの部分文字列一致

PREFIXabcSUFFIX

私はabcに一致するクエリを作成する必要があります。私は常にプレフィックスの長さを知っています。

私は、スペースの制約のEdgeNgramNgramを使用することはできません。(彼らはより多くのインデックスを作成しますと。)

だから私は、クエリ時間ではなく、インデックスの時間でこれを行う必要があります。接頭辞としてワイルドカードを使用すると、*abc*のようなものがパフォーマンスに大きな影響を与えます。

私は接頭辞の長さを知っているので、私は....abc*のような何らかの方法で対応したいと思っています。ドットは接頭辞の正確な長さを表しているので、全体の索引を検索するほど悪くありませんワイルドカードクエリ(*abc*)の場合と同様です。

これはsolrでも可能ですか?御時間ありがとうございます 。

Solrのバージョン:4.10

答えて

3

確かに、ワイルドカード構文は????abc*ようなものを検索することができ、documented hereです。また、正規表現のクエリを使用することもできます。

ただし、*abc*を超えるこのパフォーマンスの利点は非常に小さくなります。それでも、索引全体にわたって順次検索を実行する必要があります。しかし、検索ニーズをサポートするために分析を改善する方法がない場合は、それを回避することはできません(GIGO)。

1

これにはthe RegularExpressionPatternTokenizerを使用できます。下のサンプルでは、​​接頭辞の長さは6であると推測しました。あなたのサンプルテキストPREFIXabcSUFFIXabcSUFFIXになります。あなたはトークナイザについてabc*

<analyzer> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern=".{6}(.+)" group="1"/> 
</analyzer> 

を検索することができる。この方法:

このトークナイザは、トークンに入力されたテキストストリームを破るためにJava正規表現を使用しています。パターン引数によって提供される式は、トークンを区切る区切り文字として解釈されるか、トークンとしてテキストから抽出されるパターンに一致するように解釈されます。

関連する問題