【问题标题】:Performing searches on JSON data in Elasticsearch在 Elasticsearch 中对 JSON 数据执行搜索
【发布时间】:2015-06-12 04:05:30
【问题描述】:

我已经通过 Logstash 将 JSON 数据映射到 Elasticsearch,它已经工作了,它已经导入了数据,我可以在 Elasticsearch-Head 中看到它。

我的问题是查询数据。我可以搜索一个字段,但它会将索引中的整个类型作为单个搜索结果返回。我尝试了一些变化,但没有任何运气。

这里是 logstash 运输文件:

input {
   exec {
     type => "recom_db"
     command => "curl -s -X GET http://www.test.com/api/edselastic/recom_db.json"
     interval => 86400
     codec => "json"
   }
   exec {
     type => "recom_ki"
     command => "curl -s -X GET http://www.test.com/api/edselastic/recom_ki.json"
     interval => 86400
     codec => "json"
   }
   exec {
     type => "recom_un"
     command => "curl -s -X GET http://www.test.com/api/edselastic/recom_un.json"
     interval => 86400
     codec => "json"
   }
}
output {
        elasticsearch {
                host => localhost
                index => "lib-recommender-%{+yyyy.MM.dd}"
                template_name => "recommender-template"
        }
}

Elasticsearch 索引格式如下:

{
    "_index": "lib-recommender-2015.06.11",
    "_type": "recom_un",
    "_id": "qoZE4aF-SkS--tq_8MhH4A",
    "_version": 1,
    "_score": 1,
    "_source": {
        "item": [{
            "name": "AAM219 -- reading lists",
            "link": "http://www.test.com/modules/aam219.html",
            "description": "AAM219 -- reading lists",
            "terms": {
                "term": ["AAM219"]
            }
        },
        {
            "name": "AAR410 -- reading lists",
            "link": "http://www.test.com/modules/aar410.html",
            "description": "AAR410 -- reading lists",
            "terms": {
                "term": ["AAR410"]
            }
        }
        ...

无论如何,我已经尝试以我在 Elasticsearch 文档中看到的各种方式查询数据,但无法获得所需的结果。这是我尝试过的众多查询之一:

curl -XPOST "http://localhost:9200/lib-recommender/recom_un/_search" -d'
{
    "fields": ["item.name", "item.link"],
    "query":{
        "term": {
                "item.terms.term": "AAM219"
                        }
                }
        }
}'

但它返回索引中的整个类型(选择了正确的字段但不相交并且所有这些字段):

{
    "took": 13,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 0.006780553,
        "hits": [{
            "_index": "lib-recommender-2015.06.11",
            "_type": "recom_un",
            "_id": "qoZE4aF-SkS--tq_8MhH4A",
            "_score": 0.006780553,
            "fields": {
                "item.link": ["http://www.test.com/modules/aam219.html",
                "http://www.test.com/modules/aar410.html",
                "http://www.test.com/modules/ac1201.html",
                "http://www.test.com/modules/aca401.html",

我追求以下结果:

{
    "took": 5,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 0.006780553,
        "hits": [{
            "_index": "lib-recommender-2015.06.11",
            "_type": "recom_un",
            "_id": "qoZE4aF-SkS--tq_8MhH4A",
            "_score": 0.006780553,
            "_source": {
                "item": [{
                    "name": "AAM219 -- reading lists",
                    "link": "http://www.test.com/modules/aam219.html",
                    "description": "AAM219 -- reading lists",
                    "terms": {
                        "term": ["AAM219"]
                    }
                }
            }
        }
    }
}

我错过了什么?这种搜索的索引映射是否错误(所以我应该在导入数据之前手动为elasticsearch创建一个映射文件)。查询中是否缺少我的参数?我一直在寻找答案,但现在感觉就像在兜圈子,我猜这是我忽略但不确定的简单事情。

【问题讨论】:

    标签: json elasticsearch logstash


    【解决方案1】:

    是的,要使这种用例起作用,您需要创建一个自定义映射并确保您的 item 结构是 nested 类型,否则您的 item 中的所有字段将像您看到的那样折叠在一起在您显示的结果中。

    所以映射需要是这样的:

    {
      "recom_un": {
        "properties": {
          "item": {
            "type": "nested",
            "properties": {
              "name": {
                "type": "string"
              },
              "link": {
                "type": "string"
              },
              "description": {
                "type": "string"
              },
              "terms": {
                "properties": {
                  "term": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    }
    

    然后您可以稍微修改您的查询以使用nested query 而不是这样。另请注意,我包含了inner_hits,因此您的结果仅包含匹配的嵌套文档:

    curl -XPOST "http://localhost:9200/lib-recommender/recom_un/_search" -d'
    {
      "fields": [
        "item.name",
        "item.link"
      ],
      "query": {
        "nested": {
          "path": "item",
          "query": {
            "term": {
              "item.terms.term": "AAM219"
            }
          },
          "inner_hits": {}
        }
      }
    }'
    

    【讨论】:

    • 我已经尝试过了,但现在没有结果。我已经仔细检查了映射和模板,并且“项目”对象现在具有“类型”:“嵌套”参数。还有什么我可以尝试的,或者我可能有配置问题吗?
    • item 是您文档的唯一属性还是其他属性?在前一种情况下,为什么不简单地将每个项目作为独立文档进行索引,这样您就可以完全摆脱嵌套类型?
    • 是的,您对item 的索引是正确的,它将是唯一的属性。我想在不更改数据的情况下进行嵌套搜索,因为无论如何我都必须搜索嵌套数据 (item.terms.term for example)。作为记录,您上面的答案是正确的,但我需要将"term" 更改为"match"。如果我将该字段的索引设置为"not_analyzed",您的方式将起作用。
    • 其实我还需要为terms 设置嵌套类型。我将在下面发布完整的解决方案,以帮助指导将来遇到相同问题的其他人。感谢 Val 为我指明了正确的方向。
    【解决方案2】:

    支持上述 Val 的回答。它主要是什么,但有另一层嵌套。 这是映射:

    {
      "recom_un": {
        "properties": {
          "item": {
            "type": "nested",
            "properties": {
              "name": {
                "type": "string"
              },
              "link": {
                "type": "string"
              },
              "description": {
                "type": "string"
              },
              "terms": {
                "type": "nested",
                "properties": {
                  "term": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    }
    

    我用来得到我想要的搜索查询:

    curl -XPOST "http://localhost:9200/lib-recommender/recom_un/_search" -d'
    {
      "_source": false,
      "query": {
        "filtered": {
          "filter": {
            "nested": {
              "path": "item",
              "query": {
                "nested": {
                  "path": "item.terms",
                  "query": {
                    "match": {
                      "term": "AAM219"
                    }
                  }
                }
              },
              "inner_hits": { }
            }
          }
        }
      }
    }'
    

    【讨论】:

      猜你喜欢
      • 2020-09-29
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 2015-09-12
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      相关资源
      最近更新 更多