【问题标题】:Elasticsearch: hyphen in PrefixQuery on Keyword-analyzed fieldElasticsearch:关键字分析字段上 PrefixQuery 中的连字符
【发布时间】: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

【问题讨论】:

标签: lucene elasticsearch


【解决方案1】:

您也可以使用q=... 语法来做到这一点。 q=... refers to query_string 实际上是一个较短的版本。

query_string 有点令人困惑,因为它有一些默认值,人们需要注意这些默认值来解释某些情况。

您的尝试就是这种情况:有一个名为lowercase_expanded_terms 的设置默认为true。这样做是将输入字符串小写。因此,当您搜索123-4Q* 时,您实际上是在搜索123-4q*(小写)。但是,在您分析的带有keyword 的索引中,您有大写的 Q 永远不会匹配。

您的查询将使用以下命令:

http://localhost:9200/myindex/_search?q=invoices.poNumber:123-4Q*&analyzer=keyword&lowercase_expanded_terms=false

如果您想知道为什么 123-4Q5678 尽管是大写字母还是匹配,是因为 lowercase_expanded_terms 适用于某些条件,通配符就是其中之一:

通配符、前缀、模糊和范围查询的术语是否自动小写(因为它们不被分析)。默认为真。

【讨论】:

  • +!谢谢,肯定是这个问题!我还意识到,我最初以 R 开头的测试示例在索引中实际上是小写的,这就是它们回来的原因。我已更新原始问题以更正测试数据。
【解决方案2】:

@paulirwin @searchtechbot 当您对该字段进行索引时,请使用带有 min :1 、 max :10 的 edgeGram 过滤器,并且不要使用前缀查询,只需匹配关键字。这是怎么回事,你正在索引单词的每个部分,例如:“1”“12”“123”“123-”“123-4”等......所以只要匹配它就会找到你的任何部分如果它是从你的话开始的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 2019-04-22
    • 1970-01-01
    相关资源
    最近更新 更多