2014-09-22 36 views
0

我有一个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类)?

回答

0

我终于找到了解决方案,它有点儿“快速和肮脏”,但它的工作原理:在Velocity中,我创建了一个Javascript函数来编辑q字段,该函数使用GET表单的参数onsubmit(在stackoverflow.com/questions/5763055/edit-value-of-a-html-input-form-by-javascript中描述)调用。

但是,如果您使用无速度请求处理程序(或更通常为HTML接口),则此方案无效,您需要使用Velocity。

0

我不是是否要A B-C是短语查询("A B C")真正明确或:

以下职位与我的问题三个单独的术语查询(A B C),但是:

如果您希望它是一个词组查询,只需将整个内容用引号括起来即可:"A B-C"

如果您希望单独搜索每个术语,请自行删除标点符号,然后将A B C删除。

查询解析器在空格处分隔查询子句,通常不是标点符号。这不需要分析,它只是查询语法分析器。因此,对于A B-C,您最终得到两个查询子句,AB-C。当分析开始时,B-C被分成两个术语,因此查询解析器使其成为短语查询而不是词条查询,并且最终结果看起来像A "B C"

+0

感谢您的回答。我不希望A B-C成为词组查询,我想要3个单独的词条查询。我编辑了我的评论以反映我不是唯一的用户这一事实,因此您的解决方案对我无效,我不想让用户在他们的请求中删除标点符号(也因为某些查询将使用复制/过去的事物包含了结构)。 – 2014-09-23 06:20:15

+0

我一直在思考如何使用一些逻辑来规范化搜索文本,而不是训练用户。 – femtoRgon 2014-09-23 13:15:36

+0

什么样的逻辑?我正在使用velocity模板,查询直接从网页中表单元素的文本区域到Solr的DisjunctionMaxQuery(如果我错了,请纠正我)。我会在哪里实施这样的逻辑? – 2014-10-31 11:05:19

相关问题