私の顧客は、フォトジャーナリズム (およびゴシップ) を専門とする写真代理店であるため、顧客の検索の多くは特定の人に関するものです。
見出しとキャプションで全文検索を行い、約 150 万件のドキュメントをインデックスに登録しています。タグのステミングなしの全文検索。私たちは適切なストップ ワードのリストを用意しており、正しくステミングされていないと思われる保護された単語のリストを提供しています。Dismax を使用して、見出し、キャプション、タグをさまざまなブーストで検索しています) これはすべてうまく機能しています。
ただし、正しく理解するのが難しい人もいます。たとえば、アル・ゴア。イタリア語では「al」はストップ ワードなので、「al gore」の単純なクエリ (引用符なし) は次のようになります。
+((DisjunctionMaxQuery((caption_text:gor | tags_text:gore^100.0 | headline_text:gor)))~1) ()
これは元 VP のヒットを返しますが、もちろん「レスリー ゴア」と「ティッパー ゴア」のヒットも返します。また、ステミングのおかげで、「ゴリ」などにヒットします。並べ替えを少し置いておくと、結果が乱雑になるので、もっとうまくやりたいと思います。
検索用語を引用符で囲んでも役に立ちません。「al」は取り除かれます。「ゴア」を保護された単語としてマークすることで、誤検知の数を制限することができます。私も SynonymFilterFactory で遊んでみましたが、あまりうまくいきませんでした.SynonymFilterFactory を最初のフィルターとして持っているので、「al」はとにかく削除されます.
私が本当に必要だと思うのは、「al gore」を単一のトークンとしてトークン化する方法です。構成可能な「フレーズ」のセットについて、それを可能にするものはありますか? 私が見落としている別のアプローチはありますか?おそらくsolr.CommonGramsFilterFactory?
背景情報: Solr 1.4.0 を使用しています。schema.xml の関連部分
<!-- used for headline and caption -->
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.it.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="Italian" protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.it.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="Italian" protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="tagsText" class="solr.TextField" sortMissingLast="true" omitNorms="false">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.it.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.it.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>