python-3.x - elasticsearch 的 Python 客户端在正则表达式支持方面存在问题
问题描述
elasticsearch 的 python 客户端无法按预期使用正则表达式。在附带的带有单个单词“平台”的查询示例中,它可以正常工作。一旦我添加另一个词,如“java 平台”,它就会返回 0 次点击。同样适用于带有大写字母的单词。想知道 python 客户端是否正确支持正则表达式?可能是什么问题?
我在字符串之前和之后尝试过 .* 来检查编码是否有问题,但无济于事。我需要更复杂的正则表达式,但我没有成功让这个微不足道的情况正常工作。
es = Elasticsearch([{'host': 'localhost', 'port': 9200}])
result = es.search(index="mydoc", body={"query": {"regexp" : {"Title" : "platform"}}})
result = es.search(index="mydoc", body={"query": {"regexp" : {"Title" : "java platform"}}})
没有错误。对于像第二个示例中索引文档包含字符串的简单情况,问题是 0 次命中。
解决方案
问题源于 elasticsearch 中的两种搜索模式:对每个单词使用标记的全文搜索,以及对整个字段值进行索引的关键字搜索。因此,要使用正则表达式搜索单词,我应该使用关键字模式,如下所示:
result = es.search(index='mydoc', size =34,body=
{
"query": {
"bool": {
"must": [
{ "match": { "Title": "java platform" }}
],
"filter": [
{ "regexp": { "Title.keyword": ".*[j,J]ava platform.*" }}
]
}
}
})
匹配只是为了加快搜索速度,因为正则表达式开头包含 .* 。匹配也将匹配平台 java 和中间任意数量的单词,而正则表达式匹配特定顺序,首先是 java,然后是平台(它们必须是相邻的)。
推荐阅读
- kubernetes - 错误:无法启动补丁证书循环 mutatingwebhookconfigurations.admissionregistration.k8s.io “istio-sidecar-injector”未找到
- css - dropzone 图标显示在 dropzone 之外
- gekko - 使用 Gekko opt 包,是否可以估计解决脚本需要多少内存?
- ruby-on-rails - 命令行终端餐厅应用程序错误
- rest - 如何通过 DevOps REST API 获取特定 Commit 的构建列表
- mysql - 根据另一个表的映射值来获取列的最小值的最有效查询
- c - C代码表现异常,特殊字符来自哪里?
- linux - 为什么我没有看到预期的页面错误?
- sql - BigQuery,在 BigQuery Hacker News 数据集中加入评论和故事
- python - 使用 Pandas 映射和转换 CSV