elasticsearch - 如何对弹性搜索中的数组子字段使用术语?
问题描述
我正在研究弹性搜索并在搜索查询中使用术语。请查看以下示例索引数据:
"_source": {
"type": "ITEM",
"primaryKey": "3923",
"displayName": "Lumia 505",
"attributes": {
"n26273": "Lumia 505",
"n26275": "Mobile"
},
"mappings": {
"Primary Hierarchy": [
"Nokia"
]
}
}
为了针对我的任何搜索文本搜索数据,我正在使用以下查询,该查询运行良好:
{
"query":{
"bool":{
"must":[
{
"query_string":{
"query":"----MySearchTextHere----",
"default_operator":"AND"
}
},
{
"term":{
"type":"item"
}
}
]
}
},
"size":10,
"from":0
}
查询:
1.如何在查询中添加术语以搜索作为数组的字段“mappings.Primary Hierarchy” ?
2.如何在不提及嵌套字段名称的情况下实现#1,因为嵌套字段名称是动态的?只有字段名称映射是不变的。
解决方案
"mappings.Primary Hierarchy"
在术语查询中引用嵌套字段(在您的情况下)没有问题
{
"query":{
"bool":{
"must":[
{
"query_string":{
"query":"Nokia",
"default_operator":"AND"
}
},
{
"term":{
"mappings.Primary Hierarchy":"nokia"
}
}
]
}
},
"size":10,
"from":0
}
这将被诺基亚成功过滤。如果您想完全使用诺基亚(未分析的术语),则应使用"mappings.Primary Hierarchy.keyword"
字段。这里的关键字意味着,该字段的内容与您在索引期间传递的内容完全相同。
第二件事也是可能的,但需要适当的映射。您需要指定您的映射是嵌套类型(这意味着其中可能有其他字段)。
在您的情况下的简单示例可能是这样的:
{
"mappings": {
"_doc" : {
"properties" : {
"mappings" : {
"type" : "nested"
}
}
}
}
}
您需要创建应用了这些设置的索引。
在这种情况下,您的查询可能如下所示:
{
"query": {
"nested": {
"path": "mappings",
"query": {
"multi_match": {
"query": "Nokia"
}
}
}
}
}
未指定字段的多匹配查询将默认为映射对象下的所有字段
推荐阅读
- go - 在 Go 中使用包含 int 和 str 的数组
- sql - 我有 3 张桌子,我需要一些查询
- python - 有没有办法播放 wav 文件,以便在我将程序制作为 exe 时它不依赖于本地?
- php - 如何使用 php 将 .pkpass 文件保存在服务器目录中
- reactjs - 如果没有 React-hooks 和类组件而不是函数组件(按钮侧边栏),这个 React 代码会如何?
- ffmpeg - 如何使用 ffmpeg 将多个音频文件(过滤一个)添加到视频中?
- matlab - 我的 Matlab 程序没有输出正确的信号
- powershell - 连接目录中的所有 .csv 文件,包括文件名并控制数据格式
- ruby-on-rails - Rails - 为模型添加额外的列或创建额外的关联(表)?
- java - 在 Java 中使用 Scanner 函数的意外行为