Elasticsearch通配符区分大小写

时间:2018-06-29 18:15:05

标签: elasticsearch

4 个答案:

答案 0 :(得分:4)

自 7.10 版起,setMenu 查询支持特殊参数 step="0.01"(布尔值)。 不区分大小写的搜索示例:

wildcard

答案 1 :(得分:2)

通配符不被分析。这取决于您为要搜索的字段提供了哪些分析器。但是,如果您使用默认的分析器,则通配符查询将返回不区分大小写的结果。

示例:在示例索引中发布两个名称,一个是“ Sid”,另一个是“ sid”。

POST sample/sample
{
  "name" : "sid"
}

POST sample/sample
{
  "name" : "Sid"
}

然后执行通配符查询:

GET sample/_search
{
  "query": {
    "wildcard": {
      "name": {
        "value": "s*"
      }
    }
  }
}

这将同时给我两个文件:

{
  "took": 10,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 1,
    "hits": [
      {
        "_index": "sample",
        "_type": "sample",
        "_id": "AWRPM87Wb6oopELrnEKE",
        "_score": 1,
        "_source": {
          "name": "Sid"
        }
      },
      {
        "_index": "sample",
        "_type": "sample",
        "_id": "AWRPM9tpb6oopELrnEKF",
        "_score": 1,
        "_source": {
          "name": "sid"
        }
      }
    ]
  }
}

但是,如果您对“ S *”执行通配符查询,则不会返回任何内容。因为默认令牌过滤器以小写形式存储术语,而术语“ Sid”在反向索引中存储为“ sid”。

答案 2 :(得分:1)

我一直在为nodejs客户端寻找相同的选项,因此遇到了这个问题,因此发布答案可能会对其他人有所帮助。

我必须将术语转换为小写,并且对我有用*${term.toLowerCase()}* 这是完整的功能

searchUsers(term, from, limit) {
    let users = await EsClient.search({
        index: 'users',
        type: 'users',
        body: {
            from,
            size: limit,
            query: {
                bool: {
                    should: [
                        {
                            wildcard: {
                                email: {
                                    value: `*${term.toLowerCase()}*`
                                }
                            }
                        },
                        {
                            wildcard: {
                                "name.keyword": {
                                    value: `*${term.toLowerCase()}*`
                                }
                            }
                        }
                      ],
                    must_not: {
                        terms: {_id: blacklist}
                    }
                }
            }
        }
    });
}

答案 3 :(得分:0)

在我的情况下,这是不正确的,默认情况下区分大小写-我使用的是ES 7.2。 在您的示例中,字段的类型是“文本”而不​​是“关键字”