我有一个 Solr 4.7.0 实例,索引中有 200 000 个文档(文件系统上每个文件一个文档),供多个用户使用。文档由关键字标识,这些关键字被索引并存储在一个名为“signature_1”的字段中。在索引期间,我删除了所有用空格替换的标点符号(感谢 ScriptUpdateProcessor),因此我的关键字在索引和字段 signature_1(字段类型签名)的存储部分中都用空格分隔。
<fieldType name="signature" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
<analyzer type="index">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([^a-zA-Z0-9éèàùêâûôîäëöüï])" replacement=" "/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LimitTokenCountFilterFactory" maxTokenCount="1000" consumeAllTokens="false"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<!--<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang\stopwords_fr.txt" enablePositionIncrements="true" />-->
<filter class="solr.SynonymFilterFactory" synonyms="synonyms_chantiers.txt" ignoreCase="true" expand="false"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms_chantiers_secteurs.txt" ignoreCase="true" expand="false"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="French" />
</analyzer>
<analyzer type="query">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([^a-zA-Z0-9éèàùêâûôîäëöüï])" replacement=" "/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<!--<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang\stopwords_fr.txt" enablePositionIncrements="true" />-->
<filter class="solr.SynonymFilterFactory" synonyms="synonyms_chantiers.txt" ignoreCase="true" expand="false"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="French" />
</analyzer>
</fieldType>
我希望在查询期间有相同的行为:如果有人搜索
美国广播公司
我希望 Solr 进行以下搜索(使用 OR 运算符,dismax):
美国广播公司
所以基本上,我只是想让 Solr 在文档的关键字之间搜索,标点符号被删除。
上面的例子运行良好,但在某些情况下它不是这样运行的。查询
公元前
Dismax 将查询拆分为
(+(DisjunctionMaxQuery((signature_1:a)) DisjunctionMaxQuery((signature_1:"b c"))) ())/no_coord
这弄乱了我的结果的相关性(即顺序)。我尝试使用 autoGeneratePhraseQueries="True" 但没有效果。
所以我希望 Dismax 总是在空格和标点符号上分开,或者永远不要这样做(结果是一样的)。知道如何做到这一点(无需创建我的 Java Dismax 类)吗?
以下帖子与我的问题有关: