ES 스크립트 쿼리 빈 문자열

4479 단어
본고에서 소개한 조회 방법은 ES5.2 버전을 바탕으로 한 것으로 다른 버전에는 적용되지 않을 수 있습니다.기타 버전은 홈페이지를 참조하십시오.https://www.elastic.co/guide/en/elasticsearch/reference/5.2/modules-scripting-fields.html https://www.elastic.co/guide/en/elasticsearch/reference/5.2/modules-scripting-painless-syntax.html

질의 필드가 비어 있는 문서

curl localhost:9200/customer/_search?pretty -d'{
    "size": 5,
    "query": {
        "bool": {
            "must": {
                "script": {
                    "script": {
                        "inline": "params._source.strnickname.length()<1",
                        "lang": "painless"
                    }
                }
            }
        }
    }
}'

doc,fields 및_소스 사용법


doc: analyzed text 형식의 필드를 제외하고 나머지 필드는 기본적으로 doc_가 열려 있습니다values의doc는text 필드를 조회할 수 있습니다. 전제는fielddata가 열려 있어야 합니다.그러나 fielddata를 열면 조회할 때 모든 term을 불러와서 JVM heap에 들어갑니다.메모리 소모가 너무 많으니 조심해라.홈페이지에서 doc['field_name']로 조회할 수 있다고 했지만 테스트 결과 안 되지만 doc를 통해 조회할 수 있습니다.field_name 쿼리.이후 몇 차례의 테스트를 통해 단인용 부호의 문제가 발견되었다.doc['field_name']에서 조회할 수 없습니다.항상 오류를 보고합니다.
"caused_by" : {
        "type" : "script_exception",
        "reason" : "compile error",
        "caused_by" : {
          "type" : "illegal_argument_exception",
          "reason" : "Variable [field_name] is not defined."
        },
        "script_stack" : [
          "doc[field_name].length() <  ...",
          "    ^---- HERE"
        ],
        "script" : "doc[field_name].length() < 1",
        "lang" : "painless"
      }


그러나doc[\u0027field_name\u0027]는 조회할 수 있고,doc['field_name']도 조회할 수 있습니다.상술한 예에 대해 아래의 조회 방식을 통해 조회할 수 있다
curl localhost:9200/customer/_search?pretty -d'{
    "size": 5,
    "query": {
        "bool": {
            "must": {
                "script": {
                    "script": {
                        "inline": "doc['\''strnickname'\''].length()<1",
                        "lang": "painless"
                    }
                }
            }
        }
    }
}'

fields: "store"로만 표시:true  필드를 사용할 수 있습니다._fields['field_name'].value or _fields['field_name'].values 조회.
_소스: 특수한storefields입니다.모든 필드를 사용할 수 있습니다.통과 가능_source.field_name 액세스.
curl -XPUT 'localhost:9200/my_index?pretty' -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "my_type": {
      "properties": {
        "title": { 
          "type": "text"
        },
        "first_name": {
          "type": "text",
          "store": true
        },
        "last_name": {
          "type": "text",
          "store": true
        }
      }
    }
  }
}
'
curl -XPUT 'localhost:9200/my_index/my_type/1?pretty' -H 'Content-Type: application/json' -d'
{
  "title": "Mr",
  "first_name": "Barry",
  "last_name": "White"
}
'
curl -XGET 'localhost:9200/my_index/_search?pretty' -H 'Content-Type: application/json' -d'
{
  "script_fields": {
    "source": {
      "script": {
        "inline": "params._source.title + ' '+ params._source.first_name + ' ' + params._source.last_name" 
      }
    },
    "stored_fields": {
      "script": {
        "inline": "params._fields['first_name'].value + ' ' + params._fields['last_name'].value"
      }
    }
  }
}
'


doc는storefields보다 성능이 훨씬 좋아요.


Stored fields (which includes the stored _source field) are much slower than doc-values. They are optimised for returning several fields per result, while doc values are optimised for accessing the value of a specific field in many documents. It makes sense to use _source or stored fields when generating a script field for the top ten hits from a search result but, for other search and aggregation use cases, always prefer using doc values.

좋은 웹페이지 즐겨찾기