2

ファジー、シノニム、ステミングなどの高度な検索機能をサポートする C# の Solrnet ライブラリを使用する Solr ベースの検索システムがあります。これらはすべて機能しますが、ステミング検索から期待されるのは、縮小によるステミングと拡張によるステミングの組み合わせであり、単語の文法上のバリエーションをカバーするようです。ユースケースはそれをより明確にします:

  • fish を検索すると、fishing も見つかります
  • 「適用済み」を検索すると、「適用中」、「適用中」、および「適用中」も検索されます。

SnowballPorterFilterFactory で CopyField を使用してステミングを実装しました。その結果、burningを検索すると、 burningburnの結果が返されますが、 Burnを検索すると、 burningburnt、またはburnの結果が返されません。

すべてのステマーが Lucene/Solr をサポートしており、すべて縮約によるステミングを使用しているため、これについてどうすればよいかわかりません。Solr Wikiによると:

ステミングに関連する技術は見出し語化です。これにより、展開による「ステミング」が可能になり、ルート ワードを取得して、それをさまざまな形式のすべてに「展開」できます。見出し語化は、挿入時またはクエリ時に使用できます。Lucene/Solr には見出し語化のサポートが組み込まれていませんが、独自の辞書と SynonymFilterFactory を使用してシミュレートできます。

Solr でこれを行う方法が正確にはわかりません。何か案は。

また、C# ベースのステマー/レンマタイザー ライブラリを使用して語根を取得し、WordNet などの公開データベースを使用して語幹のさまざまな文法バリエーションを抽出し、これらすべての用語を送信して Solr でクエリすることも考えていました。安定した C# ステマー/レンマタイザーと WordNet C# API を見つけるための調査はまだ行っていませんが、これは複雑になりすぎて、Solr 内から実行する方法が必要になると思われます。

Solr スキーマの関連部分:

<field name="Content" type="text_general" indexed="false" stored="true" required="true"/>
<field name="ContentSearch" type="text_general" indexed="true" stored="false" multiValued="true"/>
<field name="ContentSearchStemming" type="text_stem" indexed="true" stored="false" multiValued="true"/>

<copyField source="Content" dest="ContentSearch"/>
<copyField source="Content" dest="ContentSearchStemming"/>

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

<fieldType name="text_stem" class="solr.TextField" >
    <analyzer>
       <tokenizer class="solr.WhitespaceTokenizerFactory"/>
       <filter class="solr.SnowballPorterFilterFactory"/>
    </analyzer>          
 </fieldType>

ドキュメントのインデックスを作成すると、コンテンツは Content フィールドにそのまま保存され、テキスト ベースの検索とステミング検索のためにそれぞれ ContentSearch と ContentSearchStemming にコピーされます。そのため、ContentSearchStemming フィールドには語幹/短縮形が格納されます。Luke と Admin Schema Browser --> Term Info でこれを確認しました。管理者分析画面でテストしたところ、テキスト「burning」にインデックスを付けると、「burn」に縮小されて保存されることがわかりました。ここまでは順調ですね。

UIで、

  • ユーザーが用語「burn」を入力し、ステミング オプションをチェックするとします。ユーザーがステミングを指定しているため、結果は用語「burn」および語幹を持つすべての用語に対して返されるはずです。 「やけど」つまり、やけど、やけど、火傷など。
  • ユーザーが「書き込み」という用語を入力し、ステミング オプションをチェックするとします。ユーザーがステミングを指定しているため、"burning" という用語と、"burn" という語幹を持つすべての用語 (burn、burn、burns など) の結果が返されることが期待されます。

Solr に送信されるクエリ:

q=ContentSearchStemming:burning

デバッグ情報から:

<str name="rawquerystring">ContentSearchStemming:burning</str>
<str name="querystring">ContentSearchStemming:burning</str>
<str name="parsedquery">ContentSearchStemming:burn</str>
<str name="parsedquery_toString">ContentSearchStemming:burn</str>

そのため、結果が返されたとき、同じドキュメントに書き込みや書き込みなどの用語が含まれていても、「書き込み」という用語で強調表示されたヒットのみが表示されます。

ステミングは次のように機能するはずだと思いました。

  1. queryanalyzer チェーンのステミング フィルターは、入力単語をその語幹に減らします。燃焼 --> 燃焼
  2. クエリ コンポーネントは、用語をスキャンし、用語の語幹と入力用語の語幹との間に一致が見つかった用語を照合する必要があります。火傷 --> 火傷 (マッチ) 火傷 --> 火傷

最初のポイントが発生しています。しかし、ステム「burn」との正確なテキストベースの一致の検索を実行しているようです。したがって、火傷または火傷は返されません。

私が自分自身を明確にすることができたことを願っています。

4

0 に答える 0