2015-11-16 5 views
7

मैं एलैस्टिकसेर्च शब्द एकत्रीकरण कैसे लिख सकता हूं जो अलग-अलग टोकन की बजाय पूरे शब्द से बाल्टी को विभाजित करता है? उदाहरण के लिए, मैं राज्य द्वारा एकीकृत करना चाहते हैं, लेकिन निम्न रिटर्न नई, यॉर्क, जर्सी और कैलिफ़ोर्निया व्यक्ति बाल्टी, नहीं न्यूयॉर्क और न्यू जर्सी और कैलिफोर्निया बाल्टी के रूप में के रूप में के रूप में उम्मीद:एरेस्टिकैर शब्द एक सरणी में तारों द्वारा समेकन

curl -XPOST "http://localhost:9200/my_index/_search" -d' 
{ 
    "aggs" : { 
     "states" : { 
      "terms" : { 
       "field" : "states", 
       "size": 10 
      } 
     } 
    } 
}' 

मेरे उपयोग के मामले https://www.elastic.co/guide/en/elasticsearch/guide/current/aggregations-and-analysis.html वर्णित एक जैसा है, केवल एक अंतर के साथ: शहर का क्षेत्र मेरे मामले में एक सरणी है।

उदाहरण वस्तु:

{ 
    "states": ["New York", "New Jersey", "California"] 
} 

ऐसा लगता है कि प्रस्तावित समाधान (के रूप में not_analyzed क्षेत्र मानचित्रण) सरणियों के लिए काम नहीं करता।

मेरे मानचित्रण:

{ 
    "properties": { 
     "states": { 
      "type":"object", 
      "fields": { 
       "raw": { 
        "type":"object", 
        "index":"not_analyzed" 
       } 
      } 
     } 
    } 
} 

मैं "स्ट्रिंग" द्वारा "वस्तु" की जगह की कोशिश की है, लेकिन यह या तो काम नहीं कर रहा।

उत्तर

4

मुझे लगता है कि सब से वंचित हो रहे अपने एकत्रीकरण में "states.raw" है (ध्यान दें कि, के बाद से कोई विश्लेषक निर्दिष्ट किया जाता है, "states" क्षेत्र standard analyzer के साथ विश्लेषण किया है, उप-क्षेत्र "raw""not_analyzed" है)। हालांकि आपका मैपिंग भी देख सकता है। मैं ES 2.0 के खिलाफ अपने मानचित्रण की कोशिश की जब मैं कुछ त्रुटियाँ मिल गया है, लेकिन इस काम किया:

PUT /test_index 
{ 
    "mappings": { 
     "doc": { 
     "properties": { 
      "states": { 
       "type": "string", 
       "fields": { 
        "raw": { 
        "type": "string", 
        "index": "not_analyzed" 
        } 
       } 
      } 
     } 
     } 
    } 
} 

तब मैं डॉक्स के एक जोड़े कहा:

POST /test_index/doc/_bulk 
{"index":{"_id":1}} 
{"states":["New York","New Jersey","California"]} 
{"index":{"_id":2}} 
{"states":["New York","North Carolina","North Dakota"]} 

और इस क्वेरी आप क्या चाहते करने के लिए लगता है:

POST /test_index/_search 
{ 
    "size": 0, 
    "aggs" : { 
     "states" : { 
      "terms" : { 
       "field" : "states.raw", 
       "size": 10 
      } 
     } 
    } 
} 

लौटने:

{ 
    "took": 1, 
    "timed_out": false, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 2, 
     "max_score": 0, 
     "hits": [] 
    }, 
    "aggregations": { 
     "states": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
       "key": "New York", 
       "doc_count": 2 
      }, 
      { 
       "key": "California", 
       "doc_count": 1 
      }, 
      { 
       "key": "New Jersey", 
       "doc_count": 1 
      }, 
      { 
       "key": "North Carolina", 
       "doc_count": 1 
      }, 
      { 
       "key": "North Dakota", 
       "doc_count": 1 
      } 
     ] 
     } 
    } 
} 

यहाँ कोड मैं इसे परीक्षण के लिए किया गया है:

http://sense.qbox.io/gist/31851c3cfee8c1896eb4b53bc1ddd39ae87b173e

+0

आप अपने जवाब के लिए बहुत बहुत धन्यवाद, आप सही हैं, मेरे सवाल का वास्तव में '.raw' याद आ रही है। ऐसा इसलिए है क्योंकि मैंने मैपिंग और खोजों के कई अलग-अलग संयोजनों की कोशिश की थी और इसे पोस्ट करना समाप्त कर दिया था। आपके उत्तर ने मुझे यह पता लगाने के लिए प्रेरित किया कि मेरी वास्तविक समस्या यह है कि मैं लोचदार खोज-कोचबेस प्लगइन का उपयोग कर रहा हूं ताकि मेरे दस्तावेज़ों को लोचदार खोज में आयात किया जा सके और प्लगइन मेरे दस्तावेज़ संरचना को बदलकर '' डॉक्टर 'विशेषता के साथ बदल सके। आपके उत्तर के लिए धन्यवाद, मैंने मैन्युअल रूप से एक दस्तावेज़ जोड़ा, और यह काम किया, और इस तरह मैंने अन्य दस्तावेजों में आसपास के "डॉक्टर" विशेषता का पता लगाया। – Marieke

संबंधित मुद्दे