我有一个Solr 4.7.0实例,索引中有200 000个文档(文件系统上每个文件有一个文档),由多个用户使用。文档由关键字标识,索引并存储在一个名为“signature_1”的字段中。 在索引期间,我删除了用空格替换的所有类型的标点符号(感谢ScriptUpdateProcessor),因此我的关键字用空格分隔,都位于字段signature_1(字段类型签名)的索引和存储部分中。Solr dismax行为 - 标点符号和空格分割
<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>
我想在查询时间相同的行为:如果有人搜索
ABC
我想Solr的做下面的搜索(通过OR运算符, dismax):
ABC
所以基本上,我只是想让Solr在文档的关键字之间搜索,标点符号被删除。
上面的例子运行良好,但在某些情况下,它不是这样工作的。与
A的查询BC
Dismax分裂在查询
(+(DisjunctionMaxQuery((signature_1:a))的DisjunctionMaxQuery((signature_1: “BC”)) )())/ no_coord
这会扰乱我的结果的相关性(即顺序)。我尝试使用autoGeneratePhraseQueries =“True”,但没有效果。
因此,我希望Dismax始终在空格和标点符号上进行拆分,否则永远不要执行拆分(结果将相同)。任何想法如何能够做到这一点(无需创建我的Java Dismax类)?
- SOLR generates phrase queries on punctuation
- Solr Dismax handler - whitespace and special character behaviour
感谢您的回答。我不希望A B-C成为词组查询,我想要3个单独的词条查询。我编辑了我的评论以反映我不是唯一的用户这一事实,因此您的解决方案对我无效,我不想让用户在他们的请求中删除标点符号(也因为某些查询将使用复制/过去的事物包含了结构)。 – 2014-09-23 06:20:15
我一直在思考如何使用一些逻辑来规范化搜索文本,而不是训练用户。 – femtoRgon 2014-09-23 13:15:36
什么样的逻辑?我正在使用velocity模板,查询直接从网页中表单元素的文本区域到Solr的DisjunctionMaxQuery(如果我错了,请纠正我)。我会在哪里实施这样的逻辑? – 2014-10-31 11:05:19