1

テキストフィールドがあります。そして、特定のクエリに対して、インデックス付きフィールド値を含むすべてのドキュメントを検索したいと考えています。

query.contains(document.field_name)

例: 1. フィールド名:"a b" 2. フィールド名:"ab c"

クエリ「ab d」の場合、最初のアイテムのみを検索したい。

これを行う効率の悪い方法は、基本的に、クエリおよびインデックス フィールドのすべての部分文字列を文字列として生成することです。

既存の機能を使用して Solr でそのような要件を実装することは可能ですか? そうでない場合、これを行う最も効率的なアルゴリズム/方法は何ですか?

PS。グーグルアドワーズは、追加を見つけるためにそのようなマッチングを行うようです.

4

2 に答える 2

0

1つのSolrクエリでこれを行うのは難しいかもしれません。あなたの質問を正しく理解した場合、私が行うことは、クエリ文字列をトークン化し、各トークンを順番に検索し、検索結果を最初のクエリ文字列と比較することだと思います。たとえば、クエリ文字列が「term1term2term3」であるとします。これらの各用語を順番に検索します。

/solr/index/select?q=term1

これにより、次の結果が返される場合があります。

term1 term2 term4
term1 term2
term1 term2 term3

次に、最初のクエリ( "term1 term2 term3")との比較を実行して、各検索結果が含まれているかどうかを確認できます。上記が役に立たなかった場合はお詫び申し上げます。

于 2012-09-13T02:24:18.477 に答える
0

あなたが求めていることを行う1つの方法は次のとおりです。

フィールドタイプ

<fieldType name="exact" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="0" generateWordParts="0" catenateAll="1" />
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="0" generateWordParts="1" catenateAll="0" />
    <filter class="solr.ShingleFilterFactory" outputUnigrams="true" outputUnigramsIfNoShingles="true" tokenSeparator="" maxShingleSize="99"/>
  </analyzer>
</fieldType>

説明:

インデックス アナライザーはWordDelimiterFilterFactory、フィールド値を単語に分割するために使用します。したがって、あなたの例を使用するとa b、単語abに分割され、、 、およびa b dに分割されます。設定すると、個々の単語が破棄され、1 つの単語になります。となり、そして、なる。_abdcatenateAll="1"generateWordParts="0"abababdabd

クエリのアナライザーは似ていますが、わずかな違いがあります。単語を破棄したり連結したりしないことを除いて、値を単語に分割します。代わりに、 and を受け取って, ShingleFilterFactory, aandbを返すに単語を渡します。abab

連結の代わりに帯状疱疹を使用する理由は、 and の一致を可能にa b cするためです。のみを一致させたい場合は、シングル ファクトリを設定および削除します。a bb ca b ca b ccatenateAll="1"

この構成を使用すると、 、、および( ではない)a bのみが一致します。また、、、、、、およびと一致します。も一致することに注意してください。これらのいずれかが必要でない場合は、必要なことを正確に実行するように shingle および word フィルター ファクトリを構成できるはずです。aba ba b da b cabca bb ca b caba b

編集:この回答の以前のバージョンでは、値の開始と終了をマークするために魔法の値が設定されていました。それは不要であることがわかりました。値を連結するだけでa b、一致を防ぐことができa b dます。

編集 2 (インデックス アナライザーの修正):WhitespaceTokenizerFactoryされている必要がありますKeywordTokenizerFactory。また、 がWordDelimiterFilterFactory必要catenateAll="0"です。

于 2013-08-29T23:10:45.290 に答える