仅当与第一个过滤器不匹配时,Elasticsearch才会过滤

时间:2015-06-06 20:16:24

标签: elasticsearch lucene

我的用例是搜索有明确定义的邮政编码系统的英国地址,但我的用户可能仍会在邮政编码中出错。我想使用过滤器,因为在大多数情况下,用户将获得正确的邮政编码,我不想让Elasticsearch更加努力工作,但我想避免从我的应用程序往返ES。

我正在使用文档中描述的edge n-gram分析器,因此,以邮政编码ME4 4NR为例,我有ME4 4NRME4 4N,{{1} }和ME4 4已编入索引。我想首先按ME4进行过滤,如果没有匹配则只扩展到ME4 4NR

我可以在ES查询中实现这一点,还是需要在我的应用程序逻辑中实现这一点?任何建议将不胜感激。我可以使用ME4 4N上的must布尔过滤器和其他ME4,但我想知道是否有更好的方法?

1 个答案:

答案 0 :(得分:0)

我认为你在这里有点过于复杂。这个if-that-then-else-somethingelse可以通过ES实现,但是这种情况可能的情况是有限的。例如 - this question - “其他”部分是NewText = %NewText%%ColorNumber%%thisChar% ,其中的语句是must过滤器,首先检查另一个boolmust“条件”。因此,为了应用“if-then-else”语句的其他部分,必须仍然有效。只有当“某种条件”在编程中是真或假时,这不是一个严格的问题。您需要采用这种Elasticsearch方式,而不是编程方式。

您的解决方案 - 在missing上使用must,在其他人上使用ME4 - 不是必需的。如果您将should设置为边n-gram,则在索引时使用相同的分析器,但在搜索时也使用。这意味着,根据所使用的查询/过滤器,在执行搜索之前,您的输入文本将被分析

例如,如果您在搜索时使用analyzer查询,则会分析您提供的输入文本。这意味着如果您输入match作为搜索文本,则首先ES将对输入文本进行n-gram并使用生成的标记来搜索反向索引。因此,您无需在自己的代码中执行此操作,也无需在ES查询中提出多个ME4 4N

我的建议是首先正确设置一套定义明确的要求。意思是,知道你想要搜索的内容:考虑应该放在倒排索引中的标记,并考虑用户输入的内容。决定是否需要在索引时进行分析,,但也需要在搜索时。根据这一点,考虑在搜索时使用过滤器/查询的方法,这意味着分析输入文本,哪些不分析(should不在term时)。 然后,测试你接近并看到性能。不要假设某些东西在ES上的工作量超出应有的水平,因为你可能错了。测试并比较结果,然后开始改进并提出其他想法。