【发布时间】:2015-04-30 23:25:10
【问题描述】:
我已经定义了两个动态字段 solr 5 架构:
<dynamicField name="*_texts_en" stored="true" type="text_en" multiValued="true" indexed="true"/>
<dynamicField name="*_texts_pt" stored="true" type="text_pt" multiValued="true" indexed="true"/>
对于英语和葡萄牙语文档,具有以下索引和查询分析器:
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<charFilter class="solr.HTMLStripCharFilterFactory"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="text_pt" class="solr.TextField" omitNorms="false">
<analyzer type="index">
<charFilter class="solr.HTMLStripCharFilterFactory"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_pt.txt" format="snowball" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PortugueseLightStemFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_pt.txt" format="snowball" />
<filter class="solr.LowerCaseFilterFactory"/>
<!-- <filter class="solr.BrazilianStemFilterFactory"/> -->
<filter class="solr.PortugueseLightStemFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
</fieldType>
文档可以是葡萄牙语和英语,它将使用类似“body_texts_en”的内容作为英语字段。如果是葡萄牙语:'body_text_pt'。
但是,当在过滤器链中使用 solr.StopFilterFactory 时,我遇到了同时对两个字段进行搜索查询的问题。也就是在不知道语言的情况下搜索某个查询时,我是这样查询solr的:
{
"responseHeader": {
"status": 0,
"QTime": 1,
"params": {
"q": "suco de limão",
"defType": "edismax",
"indent": "true",
"qf": " body_texts_pt body_texts_en",
"wt": "json",
"lowercaseOperators": "true",
"stopwords": "true",
"_": "1430434475811"
}
},
"response": {
"numFound": 0,
"start": 0,
"docs": []
}
}
上面的查询是使用葡萄牙语的术语完成的。即使索引具有匹配的文档,也不会返回任何结果。 另一方面,只要我:
从“qf”参数中删除“body_texts_en”(在 solr 请求中),或者
从所有分析器中删除所有 solr.StopFilterFactory 过滤器,
正确返回匹配的文档。
因此,这里的问题在于使用 solr.StopFilterFactory 并同时查询两个字段,每个字段都有自己的 solr.StopFilterFactory 使用(如上所示)。
是否有希望使上述查询按预期工作?
提前致谢。
编辑(我根据@frances 对其解决方案编号 2 的响应编写的 Ruby 函数):
def multiple_language_query_solr(q)
fields = {'title' => 2, 'body' => 1}
query = []
I18n.available_locales.each do |locale|
locale = locale.to_s.split('-').first
fields.each do |field, boost|
field = "#{field}_texts_#{locale}" + (boost > 1 ? "^#{boost}" : '') + ':'
sentence = q.split(' ').map do |word|
field + word
end.join(' AND ')
query << "(#{sentence})"
end
end
query.join(' OR ')
end
谨此致以最诚挚的问候, 埃里克
【问题讨论】:
标签: solr full-text-search sunspot-solr