当前位置: 首页 > 知识库问答 >
问题:

从ElasticSearch中只获取匹配值和相应字段

年运珧
2023-03-14

elasticsearch中,假设我有如下文档

{
  "name": "John",
  "department": "Biology",
  "address": "445 Mount Eden Road"
},
{
  "name": "Jane",
  "department": "Chemistry",
  "address": "32 Wilson Street"
},
{
  "name": "Laura",
  "department": "BioTechnology",
  "address": "21 Greens Road"
},
{
  "name": "Mark",
  "department": "Physics",
  "address": "Random UNESCO Bio-reserve"
}

有一个用例,如果我在搜索栏中键入“Bio”,我应该从elasticsearch中获得匹配的字段值和字段名。

对于本例,

输入:“生物”

预期产出:

{
  "field": "department",
  "value": "Biology"
},
{
  "field": "department",
  "value": "BioTechnology"
},
{
  "field": "address",
  "value": "Random UNESCO Bio-reserve"
}

我应该使用什么类型的查询?我可以想到使用NGram标记器,然后使用匹配查询。但是,我不确定如何只获得匹配的字段值(而不是整个文档)和相应的字段名作为输出。

共有1个答案

涂溪叠
2023-03-14

在进一步阅读完成暗示语和上下文暗示语之后,我可以用以下方法解决这个问题:

1)为每个类型为“Completation”的记录保留一个单独的“建议”字段,上下文映射为类型为“category”。我创建的映射如下所示:

{
  "properties": {
    "suggest": {
      "type": "completion",
      "contexts": [
        {
          "name": "field_type",
          "type": "category",
          "path": "cat"
        }
      ]
    },
    "name": {
      "type": "text"
    },
    "department": {
      "type": "text"
    },
    "address": {
      "type": "text"
    }
  }
}

2)然后插入如下所示的记录(将搜索元数据添加到具有适当“上下文”的“建议”字段中)。

例如,要插入第一条记录,我执行以下操作:

{
    "suggest": [
        {
            "input": ["john"],
            "contexts": {
                "field_type": ["name"] 
            }
        },
        {
            "input": ["biology"],
            "contexts": {
                "field_type": ["department"] 
            }
        },
        {
            "input": ["445 mount eden road"],
            "contexts": {
                "field_type": ["address"] 
            }
        }
    ],
    "name": "john",
    "department": "biology",
    "address": "445 mount eden road"
}
{
    "suggest": [
        {
            "input": ["mark"],
            "contexts": {
                "field_type": ["name"] 
            }
        },
        {
            "input": ["physics"],
            "contexts": {
                "field_type": ["department"] 
            }
        },
        {
            "input": ["random unesco bio-reserve", "bio-reserve"],
            "contexts": {
                "field_type": ["address"] 
            }
        }
    ],
    "name": "mark",
    "department": "physics",
    "address": "random unesco bio-reserve"
}

4)然后像这样搜索关键字“Bio”:

本地主机:9200/test_index/test_type/_search

{
    "_source": false,
    "suggest": {
        "suggestion" : {
            "text" : "bio",
            "completion" : {
                "field" : "suggest",
                "size": 10,
                "contexts": {
                    "field_type": [ "name", "department", "address" ]
                }
            }
        }
    }
}

回应:

{
    "hits": {
        "total": 0,
        "max_score": 0,
        "hits": []
    },
    "suggest": {
        "suggestion": [
            {
                "text": "bio",
                "offset": 0,
                "length": 3,
                "options": [
                    {
                        "text": "bio-reserve",
                        "_index": "test_index",
                        "_type": "test_type",
                        "_id": "4",
                        "_score": 1,
                        "contexts": {
                            "field_type": [
                                "address"
                            ]
                        }
                    },
                    {
                        "text": "biology",
                        "_index": "test_index",
                        "_type": "test_type",
                        "_id": "1",
                        "_score": 1,
                        "contexts": {
                            "field_type": [
                                "department"
                            ]
                        }
                    },
                    {
                        "text": "biotechnology",
                        "_index": "test_index",
                        "_type": "test_type",
                        "_id": "3",
                        "_score": 1,
                        "contexts": {
                            "field_type": [
                                "department"
                            ]
                        }
                    }
                ]
            }
        ]
    }
}

有人能提出更好的方法吗?

 类似资料:
  • 我用的是Elasticsearch 7.6 我在餐厅索引中有如下文档: 计数表示收到的订单数。 当客户在网站上按菜单名称搜索时,我想给几家餐馆中菜单数量高的餐厅打高分,并将其显示在搜索结果的顶部。 要做到这一点,似乎有必要知道无痛脚本中每个文档中匹配的菜单。 我想知道这是可能的。如果是这样,我该怎么做? 更新感谢大家的回答@jaspreet chahal 我做了这样的索引: 我想做的是在使用多重匹

  • 问题内容: 所以我有一个字段以以下格式存储值:,例如23 / 2014、24 / 2014、12 / 2015等。 因此,如果将此字段映射为一个,则可以使用术语过滤器进行精确值搜索,如果我在该精确结构中搜索值(类似于1 / 2014、15 / 2014等),则可以正常工作,例如。 因此,使用11 /或/ 2014之类的其他内容进行搜索不会返回匹配。这可以。 但是,如果将字段定义为,则无法使用查询进

  • 假设我有以下文件: 我只想在搜索响应中获得与所有顶级字段匹配的嵌套对象。我的意思是,如果我搜索/筛选名为“abc”的用户,我希望下面的响应 我怎么能那么做? 参考:在elasticsearch中从数组中选择匹配的对象

  • 我有一个如下所示的ElasticSearch查询: 和像这样的文件作对。 因此,我能够根据文档名称和搜索名称与我的查询的接近程度来检索文档。 要求是,文本搜索框应该检索与查询匹配的最接近的名称,但是,如果给定相对相似的名称,在过去的时间段内投诉数量超过10的文档在搜索结果中的显示应该高于那些少于10的文档。 因此,我需要传递一个时间段的关键字,例如“01/01/2001-31/12/2001”,如

  • 假设我调用了一个RESTful服务,它在响应体中返回这个 我只需要得到映射键为' en '的值 所以我期望过滤后的结果会像这样 [“Reason1 英文翻译”、“Reason2 英文翻译”] 或 {"Reason1英文翻译","Reason2英文翻译"} 我已经尝试了下一个代码,但仍未完成 然后它返回 [{en=Reason1英文翻译,es=Reason2西班牙文翻译},{en=Reason2英文

  • 我正在Node.js中编写一个RESTAPI,使用Mongoose访问MongoDB后端数据库。我想提供一个APIendpoint,它返回与特定variationStatus匹配的数组对象数量的计数。 这是我到目前为止得到的,但它给了我一个空洞的回答。。。 这是我的模型。。。 有人帮我吗? 谢谢