我有一个工作的Lucene索引支持建议服务。当用户键入搜索框时,它会通过SUGGESTION_FIELD查询索引。 SUGGESTION_FIELD中的每个条目都可以是许多支持的语言之一,并且每个条目都使用适当的语言特定分析器进行存储。为了知道使用了什么样的分析仪,每个条目有第二个字段存储LOCALE。因此,在查询期间,我可以说出类似下面的代码,使用适当的分析器进行语言特定的查询
QueryParser parser = new QueryParser(Version.LUCENE_33, SUGGESTION_FIELD, getLangaugeAnalyzer(locale));
return searcher.search(parser.parse("SUGGESTION_FIELD:" + queryString + " AND LOCALE:"
+ locale), 100);
作品......但现在客户希望能够一次使用多种语言进行搜索。
我的问题:考虑到建议服务需要非常快,最快的查询解决方案是什么?...
溶胶。 #1。最简单的解决方案似乎是;多次查询。对每个区域设置一次,从而每次都应用相应的语言分析器。最后以一种合理的方式附加每个查询的结果
溶胶。 #2。或者,我可以使用每个语言环境的列重新索引,以便:
SUGGESTION_FIELD_en, SUGGESTION_FIELD_fr, SUGGESTION_FIELD_es etc..
为每个字段使用不同的分析器(使用PerFieldAnalyzerWrapper),然后使用更复杂的查询字符串进行查询,以便:
"SUGGESTION_FIELD_en:" + queryString + " AND SUGGESTION_FIELD_fr:" + queryString + " AND SUGGESTION_FIELD_es:" + queryString
如果您认为,请帮忙:)。
答案 0 :(得分:1)
您的查询将是这样的:(sugField:queryString1 AND locale:loc1)OR(sugField:queryString2 AND locale:loc2)OR ....这是一个顶级BooleanQuery,其中添加了下级BooleanQueries = SHOULD,其中每个从属查询的条件为occurrence =必须。 queryString1,queryString2等是具有相同输入的不同语言分析器的输出,即用户输入的字符串。
每个从属查询都涉及在索引中很少见的强制性术语(来自您的查询字符串),Lucene在一开始就知道这一点(它知道索引中每个术语的总文档数),因此它将首先约束结果queryString然后另外与语言环境术语相交。无论索引多大,这都非常有效。
对于不同的分析器,我建议您不要使用QueryParser,而是以编程方式创建整个查询。只要您不手动输入查询,这是一个很好的一般建议,在您的情况下,这是获得分析方面控制权的唯一方法。通过每个特定于语言的分析器运行查询字符串,并将其输出标记作为TermQueries添加到下级BooleanQueries。