2013-07-28 3 views
10

क्या कोई विशिष्ट फ़ील्ड की लंबाई के आधार पर ElasticSearch दस्तावेज़ों को फ़िल्टर करने का कोई तरीका है?लोचदार खोज: क्षेत्र की लंबाई के आधार पर दस्तावेजों को फ़िल्टर करना?

उदाहरण के लिए, मेरे पास "बॉडी" क्षेत्र के साथ दस्तावेज़ों का एक समूह है, और मैं केवल उन परिणामों को वापस करना चाहता हूं जहां शरीर में वर्णों की संख्या> 1000 है। क्या ईएस में ऐसा करने का कोई तरीका नहीं है इंडेक्स में लंबाई के साथ एक अतिरिक्त कॉलम जोड़ें?

उत्तर

7

स्क्रिप्ट फिल्टर, इस तरह का उपयोग करें:

"filtered" : { 
    "query" : { 
     ... 
    }, 
    "filter" : { 
     "script" : { 
      "script" : "doc['body'].length > 1000" 
     } 
    } 
} 

संपादित क्षमा करें, संदर्भ के लिए the query DSL guide on script filters

+1

[लोचदार खोज 2.1 के लिए प्रलेखन) (https://www.elastic.co/ गाइड/एन/लोचदार खोज/संदर्भ/वर्तमान/मॉड्यूल-स्क्रिप्टिंग.html) '। लम्बाई' फ़ील्ड का उल्लेख नहीं करता है, क्या यह अभी भी काम करता है? – robinst

+0

संभवतः, यदि आप स्पष्ट रूप से स्क्रिप्टिंग समर्थन को सक्षम करते हैं तो यह अभी भी काम करेगा (स्क्रिप्टिंग को v1.4 में डिफ़ॉल्ट रूप से अक्षम किया गया था)। ग्रोवी स्क्रिप्टिंग अब एमवीईएल के बजाए उपयोग की जाती है, इसलिए आप शायद इसमें जांचना चाहेंगे। – Phil

+0

http://stackoverflow.com/questions/23023233/elasticsearch-statistical-facet-on-length-of-string-field उल्लेख है कि आप '"स्क्रिप्ट" का उपयोग कर सकते हैं: "डॉक्टर [' body ']। Value.length() "' जो मेरे लिए 1.7.5 पर काम किया – nezda

0

आप कस्टम tokenizer बना सकते हैं और में के रूप में एक multifields संपत्ति में उपयोग कर सकते हैं मतलब निम्नलिखित:

PUT test_index 
{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "character_analyzer": { 
      "type": "custom", 
      "tokenizer": "character_tokenizer" 
     } 
     }, 
     "tokenizer": { 
     "character_tokenizer": { 
      "type": "nGram", 
      "min_gram": 1, 
      "max_gram": 1 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "person": { 
     "properties": { 
     "name": { 
      "type": "text", 
      "fields": { 
      "keyword": { 
       "type": "keyword" 
      }, 
      "words_count": { 
       "type": "token_count", 
       "analyzer": "standard" 
      }, 
      "length": { 
       "type": "token_count", 
       "analyzer": "character_analyzer" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

PUT test_index/person/1 
{ 
    "name": "John Smith" 
} 

PUT test_index/person/2 
{ 
    "name": "Rachel Alice Williams" 
} 

GET test_index/person/_search 
{ 
    "query": { 
    "term": { 
     "name.length": 10 
    } 
    } 
} 
संबंधित मुद्दे