2015-06-06 30 views
0

我的用例用于搜索英国地址,在那里有一个明确定义的邮政编码系统,但是我的用户可能仍然在邮编中发生错误。我想使用过滤器,因为在大多数情况下,用户将获得正确的邮编,我不想让Elasticsearch更加努力工作,但是我希望避免从应用程序到ES的往返运行。Elasticsearch过滤器只有在与第一个过滤器不匹配的情况下

我正在使用edge n-gram分析器如在该文档中所描述的,所以,取邮政编码ME4 4NR作为一个例子我有ME4 4NRME4 4NME4 4ME4索引。我想先按ME4 4NR进行过滤,如果这样不产生匹配,则只能扩展到ME4 4N

我可以在我的ES查询中实现这一点,还是需要在我的应用程序逻辑中实现这个功能?任何意见将不胜感激。我可以在其他人上使用ME4should上的must布尔值过滤器,但我想知道是否有更好的方法?

回答

0

我认为你在这里有点过分复杂化。这个如果是这样的话,那么可以用ES来实现,但是这种情况是可能的。例如 - this question - “其他”部分是must,其中声明为bool过滤器,首先使用missing“条件”检查另一个must。所以,为了应用“if-then-else”陈述的其他部分,某些事情必须是真实的。只有当“某种条件”在编程中是真或假时,才会这样做并不是一个严格的问题。您需要采用这种Elasticsearch方式,而不是编程方式。

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

例如,如果您在搜索时使用match查询,则会分析您提供的输入文本。这意味着如果您输入ME4 4N作为搜索文本,则第一个ES将边界n-gram输入文本,并使用结果标记搜索倒排索引。因此,无需在自己的代码中执行此操作,也不需要在ES查询中提供多个should

我在这里的建议是首先正确设置一组定义明确的需求。意思是,知道你想要搜索的内容:思考应该放在倒排索引中的标记,并考虑用户输入的内容。决定您是否需要在索引时间处进行分析,但是也需要在搜索时间处进行分析。根据这一点,考虑在搜索时使用过滤器/查询的方式,这意味着分析输入文本,哪些不会(例如,term不是match)。 然后,测试你接近和看到的表现。不要以为自己可能错了,因为有什么东西在ES上做了更多的工作。测试并比较结果,然后开始改进并提出其他想法。

+0

感谢您的建议Andrei,非常感谢。现在,我在第一部分(例如ME4)上提供了一个过滤器,使ES在7000万条记录上的生活变得轻松多了,并保持搜索性能良好,结果合理,然后将完整的邮政编码作为常规匹配传递给分析仪查询并让它做它的事情,结果非常好,再次感谢您的帮助。 –

相关问题