2012-08-24 16 views
16

में उपसर्ग पर कैसे मिलान करें मान लें कि मेरे लोचदार खोज सूचकांक में मेरे पास "डॉट्स" नामक एक फ़ील्ड है जिसमें विराम चिह्न अलग शब्दों (जैसे "first.second.third") की एक स्ट्रिंग होगी।Elasticsearch

मुझे उदाहरण के लिए खोजना होगा "first.second" और फिर उन सभी प्रविष्टियों को प्राप्त करें जिनके "डॉट्स" फ़ील्ड में एक स्ट्रिंग है जो "first.second" या "first.second" से शुरू हो रही है।

मुझे यह समझने में समस्या है कि टेक्स्ट क्वेरीिंग कैसे काम करती है, कम से कम मैं नौकरी करने वाली क्वेरी बनाने में सक्षम नहीं हूं। पर सिंटैक्स के बारे में

$ curl -XGET http://localhost:9200/myapp/index -d '{ 
    "dots": "first.second*" 
}' 

अधिक उदाहरण:

उत्तर

20

Elasticsearch Path Hierarchy Tokenizer कि वास्तव में इस तरह के प्रयोग के मामले के लिए बनाया गया था है।

# Create a new index with custom path_hierarchy analyzer 
# See http://www.elasticsearch.org/guide/reference/index-modules/analysis/pathhierarchy-tokenizer.html 
curl -XPUT "localhost:9200/prefix-test" -d '{ 
    "settings": { 
     "analysis": { 
      "analyzer": { 
       "prefix-test-analyzer": { 
        "type": "custom", 
        "tokenizer": "prefix-test-tokenizer" 
       } 
      }, 
      "tokenizer": { 
       "prefix-test-tokenizer": { 
        "type": "path_hierarchy", 
        "delimiter": "." 
       } 
      } 
     } 
    }, 
    "mappings": { 
     "doc": { 
      "properties": { 
       "dots": { 
        "type": "string", 
        "analyzer": "prefix-test-analyzer", 
        //"index_analyzer": "prefix-test-analyzer", //deprecated 
        "search_analyzer": "keyword" 
       } 
      } 
     } 
    } 
}' 
echo 
# Put some test data 
curl -XPUT "localhost:9200/prefix-test/doc/1" -d '{"dots": "first.second.third"}' 
curl -XPUT "localhost:9200/prefix-test/doc/2" -d '{"dots": "first.second.foo-bar"}' 
curl -XPUT "localhost:9200/prefix-test/doc/3" -d '{"dots": "first.baz.something"}' 
curl -XPOST "localhost:9200/prefix-test/_refresh" 
echo 
# Test searches. 
curl -XPOST "localhost:9200/prefix-test/doc/_search?pretty=true" -d '{ 
    "query": { 
     "term": { 
      "dots": "first" 
     } 
    } 
}' 
echo 
curl -XPOST "localhost:9200/prefix-test/doc/_search?pretty=true" -d '{ 
    "query": { 
     "term": { 
      "dots": "first.second" 
     } 
    } 
}' 
echo 
curl -XPOST "localhost:9200/prefix-test/doc/_search?pretty=true" -d '{ 
    "query": { 
     "term": { 
      "dots": "first.second.foo-bar" 
     } 
    } 
}' 
echo 
curl -XPOST "localhost:9200/prefix-test/doc/_search?pretty=true&q=dots:first.second" 
echo 
+0

क्षमा करें, अब तक आपकी पोस्ट नहीं देखी गई !! बहुत बहुत धन्यवाद :) जैसे ही मुझे समय मिल जाएगा! – Stine

+0

मैं अपने जावा कोड में सेटिंग्स और मैपिंग सामग्री कैसे कर सकता हूं? – Stine

+1

'client.admin() इंडेक्स()। CreateCreate (" test ")। AddMapping (" type1 ", मैपिंग) .setSettings (सेटिंग्स) .execute()। ActionGet();' – imotov

1

आप इस तरह आपकी क्वेरी, कुछ करने के लिए एक commodin वर्ण का उपयोग करना चाहिए http://lucene.apache.org/core/old_versioned_docs/versions/2_9_1/queryparsersyntax.html

+0

आपके द्वारा पोस्ट किया गया JSON वास्तव में एक प्रश्न नहीं है, क्या आप इसे सही कर सकते हैं? – javanna

2

prefix queries पर एक नज़र डालें।

$ curl -XGET 'http://localhost:9200/index/type/_search' -d '{ 
    "query" : { 
     "prefix" : { "dots" : "first.second" } 
    } 
}' 
+1

स्ट्रिंग में विराम चिह्न होने पर काम नहीं करता है:/ – Stine

+1

[यह] (https://gist.github.com/3457388) एक नई अनुक्रमणिका पर काम करता है।क्या आपके सूचकांक पर विशेष मैपिंग है? शायद आपको एक नई, स्वच्छ सूचकांक पर प्रयास करना चाहिए। – A21z

+0

क्या उपसर्ग खोज या पथ पदानुक्रम टोकननाइज़र का उपयोग करने के बीच कोई दक्षता अंतर है? –

1

वहाँ के रूप में elasticsearch documentation में बताया, एक बहुत ही आसान तरीका भी है: यहां अपने सूचकांक के लिए यह निर्धारित करने के लिए का एक उदाहरण है

बस का उपयोग करें:

{ 
    "text_phrase_prefix" : { 
     "fieldname" : "yourprefix" 
    } 
} 

या 0.19.9 के बाद से:

{ 
    "match_phrase_prefix" : { 
     "fieldname" : "yourprefix" 
    } 
} 

के बजाय:

{ 
    "prefix" : { 
     "fieldname" : "yourprefix" 
} 
1

मैं एक समान समाधान की तलाश में था - लेकिन केवल एक उपसर्ग से मेल खाता था। मैं @ imtov के answer पाया मुझे लगभग वहाँ पाने के लिए, लेकिन एक बदलाव के लिए - चारों ओर विश्लेषक स्विचिंग:

"mappings": { 
    "doc": { 
     "properties": { 
      "dots": { 
       "type": "string", 
       "analyzer": "keyword", 
       "search_analyzer": "prefix-test-analyzer" 
      } 
     } 
    } 
} 

बजाय

"mappings": { 
    "doc": { 
     "properties": { 
      "dots": { 
       "type": "string", 
       "index_analyzer": "prefix-test-analyzer", 
       "search_analyzer": "keyword" 
      } 
     } 
    } 
} 

इस तरह जोड़ने:

'{"dots": "first.second"}' 
'{"dots": "first.third"}' 

जोड़ने करेंगे first, second, third टोकन संग्रहीत किए बिना केवल इन पूर्ण टोकन।

अभी तक या तो

first.second.anyotherstring 
first.second 

के लिए खोज सही ढंग से केवल पहली प्रविष्टि वापस आ जाएगी:

'{"dots": "first.second"}' 

नहीं वास्तव में क्या आप के लिए कहा, लेकिन किसी भी तरह से संबंधित है, इसलिए मैं किसी की मदद कर सकता है सोचा।