私のスキーマ:
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords.txt"
enablePositionIncrements="true"
/>
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1"
catenateWords="1" catenateNumbers="1" catenateAll="0"
splitOnCaseChange="1" splitOnNumerics="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="English"
protected="protwords.txt"/>
</analyzer>
</fieldType>
やりたい組み合わせ:
「ウォルマート」、「ウォルマート」、「ウォルマート」、「ウォルマート」、「ウォルマート」
これらの文字列のいずれかが与えられた場合、もう一方の文字列を見つけたいと思います。
したがって、以下に示すように 25 の組み合わせがあります。
(最初の列は検索用の入力テキストを示し、2 番目の列は予想される一致を示します)
(Walmart,Walmart)
(Walmart,WalMart)
(Walmart,Wal Mart)
(Walmart,Wal-Mart)
(Walmart,Wal-mart)
(WalMart,Walmart)
(WalMart,WalMart)
(WalMart,Wal Mart)
(WalMart,Wal-Mart)
(WalMart,Wal-mart)
(Wal Mart,Walmart)
(Wal Mart,WalMart)
(Wal Mart,Wal Mart)
(Wal Mart,Wal-Mart)
(Wal Mart,Wal-mart)
(Wal-Mart,Walmart)
(Wal-Mart,WalMart)
(Wal-Mart,Wal Mart)
(Wal-Mart,Wal-Mart)
(Wal-Mart,Wal-mart)
(Wal-mart,Walmart)
(Wal-mart,WalMart)
(Wal-mart,Wal Mart)
(Wal-mart,Wal-Mart)
(Wal-mart,Wal-mart)
私のスキーマの現在の制限:
1. "Wal-Mart" -> "Walmart",
2. "Wal Mart" -> "Walmart",
3. "Walmart" -> "Wal Mart",
4. "Wal-mart" -> "Walmart",
5. "WalMart" -> "Walmart"
アナライザーのスクリーンショット:
これらの制限を解決するために、さまざまなフィルターの組み合わせを試しましたが、Solr - 大文字と小文字を区別しない検索が機能しないソリューションにつまずきました。
私が持っている制限の 1 つを克服しているように見えますが (#5 ウォルマート -> ウォルマートを参照)、以前の制限よりも全体的に悪いです。現在、次のような場合には機能しません。
(Wal Mart,WalMart),
(Wal-Mart,WalMart),
(Wal-mart,WalMart),
(WalMart,Wal Mart)
besides cases 1 to 4 as mentioned above
スキーマ変更後のアナライザー:
質問:
「WalMart」が「Walmart」と初期スキーマと一致しないのはなぜですか?
wal
Solr アナライザーは、インデックス時間中mart
に3 つのトークンを生成したことを明確に示していますwalmart
。クエリ時間中: 1 つのトークンが生成されました: (トークンが 1 つしか生成されない理由は明らかではありませんが) 、クエリ トークンとインデックス トークンの両方に含まれるトークンがwalmart
一致しない理由がわかりません。walmart
ここで言及した問題は、1 つのユース ケースにすぎません。次のような少し複雑なものがあります。
アポストロフィー付きの単語: 「マクドナルド」、「マクドナルド」、「マクドナルド」、「マクドナルド」、「マクドナルド」、「マクドナルド」
句読点が異なる単語: 「マクドナルド エンジニアリング カンパニー」
一般に、この種の要件でスキーマをモデル化するための最良の方法は何ですか? Nグラム?異なるフィールド (異なる形式) で同じデータにインデックスを付け、copyField ディレクティブ ( https://wiki.apache.org/solr/SchemaXml#Indexing_same_data_in_multiple_fields ) を使用しますか? これのパフォーマンスへの影響は何ですか?
編集: 私の Solr スキーマのデフォルトの演算子は AND です。ORに変更できません。