elasticsearch - Elasticsearch 匹配 VS query_string
问题描述
这是我的测试:
使用匹配
{"query":{"bool":{"must":[{"match":{"name":{"query":"ka"}}},{"term":{"kind":"k1 "}}]}}}
0 次点击
然后使用 query_string
{"query":{"bool":{"must":[{"query_string":{"fields":["name"],"query":"*ka*"}},{"term":{ "种类":"k1"}}]}}}
约 1000+ 次点击
一些名称,如“katyperry”、“KathleenLights”等。使用无法找到它们match
此外,另一个让我更加疑惑的例子是,当我使用match
搜索电子邮件 时
{“查询”:{“布尔”:{“必须”:[{“匹配”:{“电子邮件”:“testname@gmail.com”}}]}}}
ES 返回所有包含“gmail.com”的电子邮件
那么在这些情况下“匹配”是如何工作的呢?
解决方案
您的第一个查询没有返回任何结果,因为您没有使用通配符搜索,即使您想这样做也无法做到,因为“匹配”不支持通配符。:) 改用这个:
{"query":{"bool":{"must":[{"wildcard":{"name":"*ka*"}},{"term":{"kind":"k1"}}]}}}
您的最后一个查询返回这些结果,因为您将电子邮件保存为已分析的字符串,并且标准分析器将字符串拆分为空格和标点符号。当您索引“hello,world”并能够匹配“hello”和“world”时,这是一件好事。但这也意味着“testname@gmail.com”被视为三个词——“testname”、“gmail”和“com”。
解决此问题需要将“电子邮件”定义为映射中的未分析字符串。除非您使用的是 v5.0 或更高版本,在这种情况下——好消息!您已经有一个未分析的“关键字”字段,以下查询将神奇地为您工作:
{"query": {"bool": {"must": [{ "match":{"email.keyword":"testname@gmail.com"}}]}}}
推荐阅读
- ios - 从 Swift 中的 MockedWebService 返回条件响应
- python - 如何结合使用参数化单元测试和模拟
- ios - 为什么我的 2D UIViews 不出现在屏幕上?
- flutter - 如何从函数中获取和打印地图数据 (Flutter)
- ios - 从 Firestore 数据添加子视图 (UIKit)
- html - 如何在页面中间对齐 3 个 div?
- android - 评估项目“:react-native-reanimated”时出现问题
- python - 使用python跳过excel工作簿中的空工作表
- mongodb - Spring mongodb:空列表为空(跳过的字段)
- javascript - 为什么在第一次单击时会在 UI 中删除值,但在第二次单击时,数据不会保留?(还原/反应)