zoukankan      html  css  js  c++  java
  • Elasticsearch-如何控制存储和索引文档(_source、_all、返回源文档的某些字段)

    Elasticsearch-如何控制存储和索引文档(_source、_all)

    _source:可以在索引中存储文档。
    _all:可以在单个字段上索引所有内容。

    1. 存储原有内容的_source

    _source字段按照原有格式来存储原有的文档。这一点可以看到匹配某个搜索的文档,而不仅仅是他们的ID。
    _source字段的enabled可以设置为true或者false,来指定是否需要存储原始的文档。默认情况下是true,在很多情况下,设置为true还是非常有用的,因为_source的存在允许使用其他重要的ES特性。(由于很多功能都依赖于_source,而且从空间和性能的角度来看存储的成本相对低廉,在版本2.0中将无法再关闭_source选项。)
    为了理解这个字段是如何工作的,来看下当检索某篇之前索引的文档时,ES通常返回什么:
    (1) 先索引一篇文档

    curl -XPUT 'localhost:9200/music/album/5?pretty' -d '{
    "name":"七里香",
    "date":"2004-08-03",
    "songs":["七里香","搁浅"]
    }'

    (2) 检索

    FengZhendeMacBook-Pro:cv FengZhen$ curl 'localhost:9200/music/album/5?pretty'

    {

      "_index" : "music",

      "_type" : "album",

      "_id" : "5",

      "_version" : 1,

      "found" : true,

      "_source" : {

        "name" : "七里香",

        "date" : "2004-08-03",

        "songs" : [ "七里香", "搁浅" ]

      }

    }

    搜索的同时,会获得_source的JSON,因为这是默认设置会返回的内容。

    2. 仅仅返回源文档的某些字段

    当检索或者搜索某篇文档的时候,可以要求ES只返回特定的字段,而不是整个_source.一种实现的方法是在fields参数中提供用逗号分隔的字段列表。如下

    FengZhendeMacBook-Pro:cv FengZhen$ curl -XGET 'localhost:9200/music/album/5?pretty&fields=name'

    {

      "_index" : "music",

      "_type" : "album",

      "_id" : "5",

      "_version" : 1,

      "found" : true,

      "fields" : {

        "name" : [ "七里香" ]

      }

    }

    如果_source已经被存储,ES从那里获取所需的字段。也可以通过设置store选项为yes来存储个别的字段。举个例子,如果只需要存储test_name字段,映射如下

    curl -XPUT 'localhost:9200/music/_mapping/test' -d '{
        "test":{
            "properties":{
                "test_name":{
                    "type":"string",
                    "store":"yes"
                }
            }
        }
    }'

    向ES请求特定的字段时,这样做可能会很有帮助,原因是相对于检索整个_source然后再抽取而言,检索单一的存储字段要更快一些,尤其是在文档很大的时候。
    注意:当存储单独的字段时,应该考虑到存储的越多,索引越大。更大的索引经常意味着更慢的索引和搜索速度。
    就其内部来看,_source只是另一个Lucene中的存储字段。ES将原始的JSON存储于其中,然后按需抽取字段。

    3. 索引一切的_all

    _all是索引所有的信息。当搜索_all字段的时候,ES将在不考虑是哪个字段匹配成功的情况下,返回命中的文档。当用户不知道在哪里查询某些内容的时候,这一点非常有用。
    从URI上运行搜索时如果不指定字段名称,系统默认情况下将会在_all上搜索:

    curl 'localhost:9200/music/album/_search?pretty' -d '{
        "query":{
            "query_string":{
                "query":"八度空间"
            }
        }
    }'

    如果总是在特定的字段上搜索,可以通过设置enabled为false来关闭_all:

    "events":{
    "_all":{"enabled":false}
    }

    如此设置会使得索引的规模变得更小,而且索引操作变得更快。
    默认情况下,include_in_all隐式的设置为true,每个字段都会包含在_all之中。可以使用这个选项来控制哪些字段被_all包含,而哪些不被_all包含。
    (1).将test_date字段设置为不在_all中

    curl -XPUT 'localhost:9200/music/_mapping/test' -d '{
        "test":{
            "properties":{
                "test_date":{
                    "type":"date",
                    "include_in_all":false
                }
            }
        }
    }'

    (2).索引新文档

    curl -XPUT 'localhost:9200/music/test/1?pretty' -d '{
        "test_name":"八度空间",
        "test_date":"2002-07-18",
        "test_songs":["半兽人","回到过去","米兰的小铁匠","最后的战役"]
    }'

    (3).查询

    FengZhendeMacBook-Pro:cv FengZhen$ curl 'localhost:9200/music/test/_search?q=2002-07-18&pretty'
    {
      "took" : 3,
      "timed_out" : false,
      "_shards" : {
        "total" : 5,
        "successful" : 5,
        "failed" : 0
      },
      "hits" : {
        "total" : 0,
        "max_score" : null,
        "hits" : [ ]
      }
    }

    此时,不指定字段查询,已经查不出数据了
    使用include_in_all的选项,将赋予更高的灵活性,灵活性不仅体现在空间存储上,同样体现在查询的表现方式上。如果一次搜索在没有指定字段的情形下运行,ES只会匹配_all所包含的字段。

  • 相关阅读:
    SQLServer 2008 附加数据库出现问题
    Window8下遇到的一些问题
    SqlServer中bit类型的性别的一些问题
    Sql server 2008 的MSSQLSERVER启动不起来
    GridView的 使用
    hibernate连接Mysql中文乱码处理
    windows部署tomcat到MyEclipse
    MyEclipse Eclipse下配置各种插件的方法
    android获取手机的网络状态
    android为HttpClient和HttpURLConnection添加中国移动代理
  • 原文地址:https://www.cnblogs.com/EnzoDin/p/11111522.html
Copyright © 2011-2022 走看看