我是 solr 的新手。我正在尝试使用日光浴室配置 solr 6.3,但我遇到了一个词干问题。我收集的文件有这样的词:“call”、“calls”、“calling”、“calling”和“serv”、“serve”、“serves”、“served”和“serving”。我在那里有“服务”,以努力了解词干分析器与产生的词干的行为。当我从我的 solarium 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
因此,从外观上看,包含关键字和实际词干的文档显示为突出显示的术语,但其余文档未显示。
我希望词干分析器能够使用关键字的不同出现来调出所有这些文档。即搜索“呼叫”应该会出现“呼叫”“呼叫”“呼叫”“呼叫”。
我的架构的相关部分如下:
<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 分析屏幕的图像。
先感谢您。