【问题标题】:elasticsearch wild card query not workingelasticsearch通配符查询不起作用
【发布时间】:2018-08-14 20:51:16
【问题描述】:

当我使用 match 指令运行查询时,我似乎遇到了一个特殊问题,如下所示,我得到了成功

{
  "query":
        {"match": {
            "value.account.names.lastName" : "*GUILLERMO*"
          }
    }
}

现在,当我使用带有通配符的查询时,如下所示,我没有得到任何结果。

{
  "query":
        {"wildcard": {
            "value.account.names.lastName" : "*GUILLERMO*"
          }
    }
}

我真的不知道可能是什么问题。非常感谢您的任何意见

【问题讨论】:

    标签: elasticsearch search match wildcard


    【解决方案1】:

    假设您尝试对分析字段运行通配符查询,则 Elasticsearch 的行为是完全正确的。正如 Elasticsearch 文档所述,通配符查询在术语级别上运行。当您使用包含字符串“Guillermo del Toro”的字段name 索引文档时,该字段的值将被小写并分成三个标记:“guillermo”、“del”和“toro”。然后,当您针对name 字段运行通配符查询*GUILLERMO* 时,Elasticsearch 会将查询字符串与每个尝试查找匹配项的单个标记进行比较。在这里你不会因为你的查询字符串是大写的而被分析的标记是小写的。

    对分析的字段运行通配符查询可能是个坏主意,但如果强烈需要,我建议使用内置的name.keyword 字段而不是仅使用name 字段(但您将再次面临区分大小写的问题)。更好的解决方案是为此目的创建您自己的小写未分析字段。

    【讨论】:

    • 非常感谢您的回复。所以我只是用小写运行通配符查询并获得了成功。所以我猜你所说的是我应该总是将我的部分查询词设置为小写以获得匹配,这准确吗?
    • @bobdabelina 这取决于字段类型。当您的查询字符串包含多个术语时,它不适用于分析(文本)字段。例如,如果您尝试运行通配符查询*guillermo ?tor*,您将不会受到任何打击,因为正如我在回答中提到的那样,Elasticsearch 不会对查询字符串应用任何转换,保持原样。显然,该索引不包含与模板*guillermo ?tor* 匹配的任何术语。另一方面,内置的keyword 字段包含原始形式的字段值。但是这里我们面临区分大小写的问题。
    • @bobdabelina 正如我所建议的,最好创建额外的包含小写值的 not-analyzed 字段,然后针对该字段运行通配符查询(显然也应该是小写)。
    • 再次感谢您的回复。不幸的是,我们无法控制该索引以及字段的创建方式,因此我正在寻找侵入性最小的方法来获得我们想要的结果,并且使用小写似乎就是
    猜你喜欢
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2017-07-08
    • 2015-01-05
    相关资源
    最近更新 更多