如何解决ElasticSearch仅返回文档的特定部分
我有一个模仿以下结构的JSON文档。
{
"mydata": [
{
"Key1": "Hello","Key2": "this","Key3": "is","Key4": "line one","Key5": "of the file"
},{
"Key1": "Hello","Key4": "line two","Key5": "of the file"
}]
}
我正在使用的索引本身没有任何特定的映射。我可以编写自由文本的Lucene查询,例如
mydata.Key4:"line one"
作为结果返回整个文档。但是,就我而言,我只想检索JSON对象的第一部分作为结果。有没有办法做到这一点?
{
"Key1": "Hello","Key5": "of the file"
}
我发现我可以使用_source_includes
并传递必需的键来检索特定字段,但是,我找不到在返回与查询匹配的JSON文档特定部分内的所有键的等效项。是因为文件如何被索引?有人可以在这里引导我吗?
编辑:
我删除了索引并更新了映射,如下所示
{
"mappings" : {
"properties" : {
"data" : {
"type" : "nested"
}
}
}
}
我重新索引了文档,快速浏览了ES文档并运行了以下嵌套查询。
{
"_source": false,"query": {
"nested": {
"path": "data","query": {
"match": {
"data.Key4": "line one"
}
},"inner_hits": {}
}
}
}
但是,这还会返回索引中的所有文档,只是现在返回的结果在inner_hits
下
{
"took": 1,"timed_out": false,"_shards": {
"total": 1,"successful": 1,"skipped": 0,"failed": 0
},"hits": {
"total": {
"value": 1,"relation": "eq"
},"max_score": 0.52889514,"hits": [{
"_index": "myindex","_type": "_doc","_id": "QAZJ-nMBi6fwNevjDQJy","_score": 0.52889514,"inner_hits": {
"data": {
"hits": {
"total": {
"value": 2,"relation": "eq"
},"max_score": 0.87546873,"hits": [{
"_index": "myindex","_nested": {
"field": "data","offset": 0
},"_score": 0.87546873,"_source": {
"Key1": "Hello","Key5": "of the file"
}
},{
"_index": "myindex","offset": 1
},"_score": 0.18232156,"Key5": "of the file"
}
}]
}
}
}
}]
}
}
我在这里想念东西吗?
解决方法
由于您没有定义mapping
,所以这是主要问题。当按照您提到的方式保存数据时,数据将被保存为text
类型的单个属性。
执行搜索时,它将带走整个文档。但是,如果您为nested
定义了mydata
映射,则可以利用inner_hits
仅检索匹配的文档。
编辑:
要使用的查询:
{
"_source": false,"query": {
"nested": {
"path": "data","inner_hits": {
},"query": {
"bool": {
"must": [
{
"term": { //To look for exact match
"data.Key4.keyword": "line one" //need to match line one not line two
}
}
]
}
}
}
}
}
使用匹配时会发生什么:
line one
将被标记如下
{
"tokens": [
{
"token": "line","start_offset": 0,"end_offset": 4,"type": "<ALPHANUM>","position": 0
},{
"token": "one","start_offset": 5,"end_offset": 8,"position": 1
}
]
}
类似地,它创建两个令牌line
,two
。
因此,当您使用match
时,它是全文搜索查询。它确实分析索引时间和搜索时间。因此,在搜索期间,将对line one
进行分析,ES会查找line
或one
。 line two
包含令牌line
,因此它也是结果的一部分。
为避免这种情况,您必须避免进行分析。因此必须使用term queries
。它寻找完全匹配。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。