使用'大写'正确查询文档的方法令牌过滤器

时间:2017-04-14 22:46:22

标签: elasticsearch

我们有一个ElasticSearch索引,其中一些字段使用自定义分析器。其中一个分析器包含Wrapped1令牌过滤器,以便在进行查询时摆脱区分大小写(例如,我们希望"球"也匹配" Ball"或&# 34; BALL&#34)

这里的问题是在进行正则表达式时,模式与索引中的术语匹配,该术语全部为大写。所以" app *"赢得了比赛" Apple"在我们的索引中,因为它在幕后真正被索引为" APPLE"。

有没有办法让这个工作没有在ES之外做一些hacky事情?

我可能会使用" query_string"相反,看看是否有任何不同的结果。

1 个答案:

答案 0 :(得分:0)

这一切都取决于您使用的查询类型。如果该类型将使用字段本身的分析器来分析输入字符串,那么它应该没问题。

如果您正在使用regexp查询,则此查询不会分析输入字符串,因此如果您将app.*传递给它,它将保持不变,这就是用户搜索的内容

但是,如果您正确地使用 query_string查询应该有效:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my": {
          "type":      "custom",
          "tokenizer": "standard",
          "filter": [
            "uppercase"
          ]
        }
      }
    }
  }, 
  "mappings": {
    "test": {
      "properties": {
        "some_field": {
          "type": "text",
          "analyzer": "my"
        }
      }
    }
  }
}

查询本身:

{
  "query": {
    "query_string": {
      "query": "some_field:app*"
    }
  }
}

为了确保它按照我的想法行事,我总是使用_validate api:

GET /_validate/query?explain&index=test
{
  "query": {
    "query_string": {
      "query": "some_field:app*"
    }
  }
}

将显示ES对输入字符串执行的操作:

  "explanations": [
    {
      "index": "test",
      "valid": true,
      "explanation": "some_field:APP*"
    }
  ]