elasticsearch - 跨多个字段匹配 Elasticsearch 查询
问题描述
我有一堆产品存储在索引中。假设以下是单个产品的示例:
'productID' => 'sandbag'
'productName' => 'Bag of sand'
'productDescription' => 'A bag of sand'
'sizes' => array
0 =>
'sizeID' => '1wht'
'sizeName' => '1 lb white'
1 =>
'sizeID' => '1blk'
'sizeName' => '1 lb black'
2 =>
'sizeID' => '2wht'
'sizeName' => '2 lb white'
3 =>
'sizeID' => '2blk'
'sizeName' => '2 lb black'
一个黑色 1 磅的 ElasticSearch 查询会显示该产品。但是,黑色 1 磅沙子的查询没有。
如果我将所有空格替换为 AND 因此查询变为黑色 AND 1 AND lb AND sand,它就会出现,但这似乎会杀死引用的查询,例如"1 lb black" sand。
我的 ElasticSearch 查询如下所示:
"query": {
"query_string": {
"query": "black 1 lb sand",
"default_operator": "AND",
"fields": ["productName", "sizes.sizeName"]
}
}
最终目标是能够在一个查询中匹配尺寸和产品名称(以及我想要的任何其他内容),并在客户需要时支持引用的短语(“1 lb black”)。
我不想将操作员切换到 OR,因为这会带来太多产品。
帮助?
解决方案
在阅读完文档后,我自己设法弄清楚了这一点。在这里为将来遇到相同问题的其他人发帖。
只需将“类型”设置为“cross_fields”,详见https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html#multi-match-types
所以搜索查询变为:
"query": {
"query_string": {
"query": "black 1 lb sand",
"default_operator": "AND",
"type": "cross_fields",
"fields": ["productName", "sizes.sizeName"]
}
}
推荐阅读
- php - 在 VSCode 中调试 PHP 在断点处停止,但从那里不起作用
- python - 在 python + sqlite3 中搜索 IN 列表
- sql - 在oracle sql中加入两个单词后如何在字符串中获取8个字符
- javascript - JQuery Post触发窗口上的点击事件
- opengl - 为什么 OpenGL 简单循环比 Vulkan 更快?
- javascript - 对 Firestore 的子集合执行 CRUD 功能
- django - Django:将具有外键关系的模型实例保存到数据库时出现问题
- mapbox - 如何使 MGLSymbolStyleLayer 动态化
- java - 当我更改活动时,计时器会重置为零
- java - Gradle 同步失败:找不到 org.jetbrains.trove4j:trove4j:20160824