• Elasticsearch 搜索不到数据问题(_mapping 设置)


    需求

    由于 kibana3 中,不支持直接在请求的 url 中设置搜索的 type (是不是我不知道???)。

    为了支持特定 type 的搜索,所以我设置了个下每个 panel 的查询语句,让它增加一个:

    "query_string": 
    {"query": " _type:"my_type" "}

    结果今天在查一个 bug 的时候,发现这样有一个坑,,, 

    问题

    由于URL请求的路径并没不能指定 type ,所以每一次的搜索,依然会查询整个 index,只是在获取结果时候,再 query 了一次 "_type" 字段。

    如果在同一个 index 下,存在不同 type 中,某个字段类型不一致的情况,那将可能导致搜索不到想要的结果。(因为不同的 type 有不同的 _mapping)

    示例1:我在一个字段第一次存的时候,filed1 存为了 string 类型,而又新建了另一个 type,且 filed1 字段类型变为了 date,

    后来在对这个字段进行时间 range 过滤操作的时候,发现总是匹配不到想要的结果,hits 总是空数组,

    URL:http://localhost:9200/index/_search
    {
        "query": {
            "filtered": {
                "query": {
                    "bool": {
                        "should": [{
                            "query_string": {
                                "query": "_type:"my_type""
                            }
                        }]
                    }
                },
                "filter": {
                    "bool": {
                        "must": [{
                            "range": {
                                "过期时间": {
                                    "from": 1860000665,
                                    "to": 2550091665
                                }
                            }
                        }]
                    }
                }
            }
        },
        "from": 0
    }

    结果1:

    {
      "took": 1,
      "timed_out": false,
      "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
      },
      "hits": {
        "total": ,
        "max_score": 1,
        "hits": []
    ......

    但是,完全相同的查询语句,如果在 URL 中指定 type,那么过滤就 OK 了,,,

    示例2:

    URL: http://200.200.194.155:9200/index/my_type/_search
    {
        "query": {
            "filtered": {
                "query": {
                    "bool": {
                        "should": [{
                            "query_string": {
                                "query": "_type:"my_type1""
                            }
                        }]
                    }
                },
                "filter": {
                    "bool": {
                        "must": [{
                            "range": {
                                "过期时间": {
                                    "from": 1861665,
                                    "to": 25500008799861665
                                }
                            }
                        }]
                    }
                }
            }
        },
        "from": 0
    }

    结果2:

    {
      "took": 1,
      "timed_out": false,
      "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
      },
      "hits": {
        "total": 67,
        "max_score": 1,
        "hits": [
          {
    ......

     解决

    确保相同字段的数据类型一致,,,

    比如上面的问题,我删除了该字段类型为 string 的那个 type 就完全 OK 了。

  • 相关阅读:
    四十四 常用内建模块 struct
    四十三 常用内建模块 base64
    Django Haystack 全文检索与关键词高亮
    python实现简单tftp(基于udp)
    多线程socket UDP收发数据
    Python 线程复习
    python 进程复习
    python pdb 调试
    Linux 复习
    Django 博客
  • 原文地址:https://www.cnblogs.com/licongyu/p/5315700.html
Copyright © 2020-2023  润新知