私はsolrが初めてです。solarium を使用して solr 6.3 を構成しようとしていますが、ステミングの問題が発生しています。私のドキュメントのコレクションには、「call」、「calls」、「called」、「calling」、「serv」、「serve」、「serves」、「served」、「serving」などの単語があります。作成された語幹でのステマーの動作を理解するために、そこに「serv」を入れています。ソラリウム php ページから solr にクエリを実行すると、得られた結果の数は、検索された単語の形式に関係なく、すべてのドキュメントが考慮されていることを示しています。ただし、すべてのドキュメントが表示されるわけではありません。例えば:
クエリの場合: 'serv' 'serv' を含むドキュメントのみが表示されます クエリの場合: 'serve' 'serve' を含むドキュメントのみが表示され
ます クエリの場合: 'serves' 'serves' および ' を含むドキュメントのみが表示されますserv' クエリの場合: 'served' 'served' および 'serv' を含むドキュメントのみを表示します クエリの場合: 'serving' 'serving' および 'serv' を含むドキュメントのみを表示します
「コール」の場合
call --> call,
calls --> calls call,
called --> called call,
calling --> calling, call
そのため、キーワードと実際の語幹を含むドキュメントは用語が強調表示されて表示されますが、残りのドキュメントは表示されません。
ステマーは、キーワードのさまざまな出現を含むこれらすべてのドキュメントを表示することを期待しています。つまり、「call」を検索すると、「call」「calling」「called」「calls」が表示されます。
私のスキーマの関連部分は次のとおりです。
<field name="content" type="text_en" indexed="true" stored="true"/>
<field name="_text_" type="stemmed_text" multiValued="true" indexed="true" stored="false"/>
<dynamicField name="stemmed_*" type="stemmed_text" indexed="true" stored="false" />
<copyField source="*" dest="_text_" />
<fieldType name="stemmed_text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.ClassicTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.KeywordRepeatFilterFactory"/>
<filter class="solr.HunspellStemFilterFactory" dictionary="en_GB.dic" affix="en_GB.aff" ignoreCase="true" strictAffixParsing="true" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.ClassicTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.KeywordRepeatFilterFactory"/>
<filter class="solr.HunspellStemFilterFactory" dictionary="en_GB.dic" affix="en_GB.aff" ignoreCase="true" strictAffixParsing="true" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.ClassicTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.ClassicTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
<filter class="solr.StopFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
</analyzer>
私のphpページの一部は次のとおりです:.....
// get a select query instance
$query = $client->createSelect();
$query->setFields(array('id', 'subject', 'content'));
// $query->setQuery('someWord');
$query->setQuery($someWord);
$query->setStart(0)->setRows($limit);
// get highlighting component and apply settings
$hl = $query->getHighlighting();
$hl->setSnippets(15);
$hl->setFields(array('content'));
$hl->setSimplePrefix('<strong>');
$hl->setSimplePostfix('</strong>');
.....
foreach ($resultset AS $document) {
$subj ='';
if (is_array($document->subject)) {
$subj = implode(', ', $document->subject);
}
echo '<table style="margin-bottom:20px; text-align:left; border:none; width:500px">';
$highlightedDoc = $highlighting->getResult($document->id);
if ($highlightedDoc) {
foreach ($highlightedDoc as $field => $highlight) {
echo $subj;
echo implode(' (...) ', $highlight) . '<br/>';
}
}
echo '</table>';
}
solr のインストールに付属する solrconfig を使用します。誰かが私が間違っていることを教えていただければ幸いです。スキーマに何か不足していますか、それとも solrconfig で構成する必要がある設定がありますか? 最後の手段として、solr.EdgeNGramFilterFactory を使用することを考えていますが、これは避けたいと思います。私のsolr分析画面の画像へのリンクを添付しています。
前もって感謝します。