【发布时间】:2015-05-22 15:19:34
【问题描述】:
我有一种情况,我将发票的元数据放入 Elasticsearch 1.5.2 索引中,该索引在带有 Oracle JDK 8u45 的 Ubuntu Linux 15.04 上运行。其中一个字段是 poNumber,它的值通常类似于“123-R45678”或“123-4Q5678”。我正在尝试使用 PrefixQuery(通过查询解析器)来搜索以前缀开头的值,例如“123-4*”或“123-R*”。我最接近成功的是在 poNumber 字段上使用关键字分析器,并在搜索时使用相同的关键字分析器,其 URL 如下所示:
http://localhost:9200/myindex/_search?q=invoices.poNumber:123-4Q*&analyzer=keyword&analyze_wildcard=true&explain=true
尽管索引中有“123-4Q5678”,但这不会返回任何结果。但是,当我搜索“123-4*”时,我确实得到了结果,并且它与“123-4Q5678”匹配:
http://localhost:9200/myindex/_search?q=invoices.poNumber:123-4*&analyzer=keyword&analyze_wildcard=true&explain=true
关键字分析器不应该做任何事情来分解字符串。我什至在 _analyze 端点对此进行了测试。查找不带连字符的值的前缀查询似乎工作正常。为什么添加“Q”字符会导致此查询不返回结果?如果字母紧跟在连字符之后,也会发生这种情况。
此外,当出现连字符时,即使整个字符串值是 PrefixQuery 的“前缀”,它也不会返回结果。但是,它会在完全匹配查询中返回结果。 (见下文)如果值或查询中不存在连字符,则搜索作为前缀的确切值确实会返回匹配的文档。
以下是其他一些测试结果:
value search term success
123-4Q5678 123* yes
123-4Q5678 123-* yes
123-4Q5678 123-4* yes
123-4Q5678 123-4Q* no
123-4Q5678 123-4Q5* no
123-4Q5678 123-4Q5678* no
123-4Q5678 123-4Q5678 yes
123-R45678 123* yes
123-R45678 123-* yes
123-R45678 123-R* no
123-R45678 123-R4* no
123-R45678 123-R45678* no
123-R45678 123-R45678 yes
r4q567 R* yes
r4q567 R4* yes
r4q567 R4Q* yes
r4q567 R4Q567* yes
r4q567 R4Q567 yes
【问题讨论】:
-
您是否尝试过使用ngrams 和查询 DSL 而不是前缀查询?我在这里写了一篇关于 ngram 的博文:blog.qbox.io/an-introduction-to-ngrams-in-elasticsearch。如果有帮助,我可以使用您在此处发布的数据向您展示一个简单的示例。
标签: lucene elasticsearch