我试图弄清楚如何创建Elasticsearch查询,允许包含保留字符的精确匹配,同时支持尾随或引导通配符扩展。我正在使用logstash动态模板,它会自动为我的每个术语创建一个原始字段。
为了尽可能简洁地总结,我想创建可以支持所有值的两种通用匹配类型的查询:
搜索'abc'
等字词,以返回'abc.xyz.com'
之类的结果。在这种情况下,标准令牌分析器创建的令牌会将'abc.xyz.com'
完全标记为一个令牌,并且可以使用以下命令成功进行通配符匹配:
{
"query": {
"wildcard": {
"_all": "*abc*"
}
}
}
搜索'/Intel/1938138191(1).zip'
等完整路径等字词,以返回'C:/Program Files (x86)/Intel/1938138191(1).zip'
之类的结果。在这种情况下,即使我反斜杠所有保留字符,执行像
{
"query": {
"wildcard": {
"_all": "*/Intel/1938138191(1).zip*"
}
}
}
不起作用。这是因为_all
默认使用标准分析器,因此路径将被拆分并且无法完全匹配。但是,如果我特意查询下面的原始字段(当我逃避/不逃避特殊字符时),我得到正确的结果:
{
"query": {
"wildcard": {
"field.raw": "*/Intel/1938138191(1).zip*"
}
}
}
所以我的问题是,有没有办法支持在一个查询中跨标准分析器分析的令牌和根本没有分析的原始字段调用通配符查询?这是通用封装搜索词的某种方式,这样在上面的两个例子中,我都会得到正确的结果?作为参考,我使用的是Elasticsearch 1.7版。我也尝试过查询字符串匹配和术语匹配,但都无济于事。