elasticsearch 仅当与第一个筛选器不匹配时,Elasticsearch筛选器,elasticsearch,lucene,elasticsearch,Lucene" /> elasticsearch 仅当与第一个筛选器不匹配时,Elasticsearch筛选器,elasticsearch,lucene,elasticsearch,Lucene" />

elasticsearch 仅当与第一个筛选器不匹配时,Elasticsearch筛选器

elasticsearch 仅当与第一个筛选器不匹配时,Elasticsearch筛选器,elasticsearch,lucene,elasticsearch,Lucene,我的用例是搜索英国地址,那里有一个定义良好的邮政编码系统,但是我的用户仍然可能会在邮政编码上出错。我想使用一个过滤器,因为在大多数情况下,用户将获得正确的邮政编码,我不想让Elasticsearch比它需要的更难,但我想避免从我的应用程序到ES的往返 我正在使用文档中描述的edge n-gram分析器,因此,以邮政编码ME4 4NR为例,我对ME4 4NR,ME4 4N,ME4和ME4进行了索引。我想先按ME4 4NR进行过滤,如果没有匹配项,则只扩大到ME4 4N 我可以在ES查询中实现这一点

我的用例是搜索英国地址,那里有一个定义良好的邮政编码系统,但是我的用户仍然可能会在邮政编码上出错。我想使用一个过滤器,因为在大多数情况下,用户将获得正确的邮政编码,我不想让Elasticsearch比它需要的更难,但我想避免从我的应用程序到ES的往返

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


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

我认为你把事情复杂化了一点。如果这样,那么ES可以实现其他一些事情,但可能的情况是有限的。例如--“else”部分是一个
must
,其中语句是一个
bool
过滤器,该过滤器首先检查另一个
must
缺少
的“条件”。因此,为了应用“if-then-else”语句的另一部分,某些内容必须仍然是真的。这并不是一个严格的问题,只有当“某个条件”是真的或假的时候才这样做,就像在编程中一样。您需要采用这种弹性搜索方式,而不是编程方式

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

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


我的建议是首先适当地设置一组定义良好的需求。也就是说,知道你希望你的搜索做什么:想想应该放在倒排索引中的标记,想想用户输入了什么。确定您是否需要在索引时进行分析,但也需要在搜索时进行分析。根据这一点,考虑在搜索时使用过滤器/查询的方法,这意味着哪些分析输入文本,哪些不分析(
term
,例如,
match
然后,测试您的方法并查看性能。不要因为您可能错了而认为某些东西在ES上做的工作比它应该做的更多。测试并比较结果,然后开始改进并提出其他想法。

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