elasticsearch - ElasticSearch 中不区分大小写的完全匹配
问题描述
我需要能够查询 ElasticSearch 索引,以查看是否有任何文档已经具有如下所示字段的特定值:
"name" : {
"type" : "text",
"fields" : {
"raw" : {
"type" : "keyword"
}
}
}
我最初打算使用normalizer来执行此操作,但我希望避免不得不对索引本身进行更改。然后我找到了match_phrase 查询,它几乎完全符合我的需要。问题是它也会返回部分匹配,只要它们开始相同。例如 - 如果我正在搜索该值this is a test
,它将返回以下值的结果:
this is a test 1
this is a test but i'm almost done now
this is a test again
在我的情况下,一旦返回数据,我可以再次检查代码以查看它是否实际上是不区分大小写的完全匹配,但我对 ElasticSearch 相对较新,我想知道是否有任何方法可以构建我的原始match_phrase
查询不会返回我上面发布的示例?
解决方案
对于任何有兴趣的人,我找到了几种不同的方法来做到这一点,第一种 - 做一个 match_phrase 查询,然后有一个检查长度的脚本:
GET definitions/_search
{
"query": {
"bool":{
"must":{
"match_phrase":{
"name":{
"query":"Test Name"
}
}
},
"filter": [
{
"script": {
"script": {
"source": "doc['name.raw'].value.length() == 9",
"lang": "painless"
}
}
}
]
}
}
}
然后我想如果我可以检查脚本中的长度,也许我可以做一个不区分大小写的比较:
GET definitions/_search
{
"query": {
"bool": {
"filter": [
{
"script": {
"script": {
"source": "doc['name.raw'].value.toLowerCase() == 'test name'",
"lang": "painless"
}
}
}
]
}
}
}
所以这些都是选择。在我的情况下,我担心性能,所以我们只是硬着头皮创建了一个规范化器,允许不区分大小写的比较,所以甚至没有使用这些。但我想我应该把它扔在这里,因为我无法在其他任何地方找到这些答案。
推荐阅读
- node.js - 从解析器抛出任何错误时,Graphql 500 内部服务器错误
- javascript - 如何防止通过某个操作调用确认?
- pyspark - 尝试连接表并获取“Resolved attribute(s) columnName#17 missing from ...”
- javascript - 追加一次 jQuery Onscroll
- go - 包:使用初始化时命名文件的重要性
- azure-active-directory - 如何使用 Azure AD SSO 访问令牌在新浏览器上登录另一个网站
- sql-server - 在 SQL Server 中每 3 分钟创建一个作业并更新表
- android - 如何为通过 localhost 提供的具有多个 SAN 的测试站点正确配置自签名证书?
- angularfire2 - AngularFireAuthGuard redirectUrl 登录后
- sql - group by 的意外输出