2015-06-15 14 views
7

Từ dưới đây dữ liệu mẫu elasticsearch Tôi muốn áp dụng wildcard nói *.000ANT.* trên _id để tìm nạp tất cả tài liệu có _id chứa 000ANT. Hãy giúp tôi.Làm thế nào để thực hiện một ký tự đại diện hoặc kết hợp regex trên _id trong elasticsearch?

"hits": [ 
    { 
    "_index": "data_collector", 
    "_type": "agents", 
    "_id": "Org000LAN_example1.com", 
    "_score": 1, 
    "fields": { 
     "host": [ 
     "example1.com" 
     ] 
    } 
    }, 
    { 
    "_index": "data_collector", 
    "_type": "agents", 
    "_id": "000BAN_example2.com", 
    "_score": 1, 
    "fields": { 
     "host": [ 
     "example2.com" 
     ] 
    } 
    }, 
    { 
    "_index": "data_collector", 
    "_type": "agents", 
    "_id": "000ANT_example3.com", 
    "_score": 1, 
    "fields": { 
     "host": [ 
     "example3.com" 
     ] 
    } 
    } 
] 
+0

Bạn có thể giải thích ý bạn bằng ký tự đại diện không? Ký tự đại diện thường là một ký tự không biết hoặc chuỗi E, G .: do * g - Trả về tài liệu với: Dog, Doug, Doorlug. Tìm kiếm chuỗi "000ANT" chỉ là một kết hợp cơ bản, bạn có thể xây dựng được không? –

+0

@ DanielHoffmann-Mitscherling: Vâng, ý tôi là [Elasticsearch regex hoặc wildcard] (https://www.elastic.co/guide/en/elasticsearch/guide/current/_wildcard_and_regexp_queries.html) vì '000ANT' có thể được thêm tiền tố và postfixed với chuỗi khác – abi1964

+0

Ah! Bạn muốn kết hợp từng phần. Tôi sẽ đăng một câu trả lời chi tiết hơn. –

Trả lời

3

Hãy thử điều này

{ 
    "filter": { 
     "bool": { 
     "must": [ 
      { 
       "regexp": { 
        "_uid": { 
        "value": ".*000ANT.*" 
        } 
       } 
      } 
     ] 
     } 
    } 
} 
+0

Điều này giải quyết vấn đề của tôi nhưng các giải pháp khác cũng được hoan nghênh. – abi1964

+0

Vì regex của tôi không bao giờ có 'đại lý' là' _type' cho tài liệu của tôi và của bạn là câu trả lời thứ nhất. Tôi chấp nhận giải pháp của bạn. Cảm ơn :) Kiểm tra ý kiến ​​[ở đây để biết thêm chi tiết] (http://stackoverflow.com/a/30844555/707414) – abi1964

1

Cho phép lập bản đồ của bạn cho id được lập chỉ mục:

{ 
    "mappings": { 
    "agents": { 
     "_id": { 
     "index": "not_analyzed" 
     } 
    } 
    } 
} 

Và sử dụng một query_string để tìm kiếm nó:

{ 
    "query": { 
    "query_string": { 
     "query": "_id:(*000ANT*)", 
     "lowercase_expanded_terms": false 
    } 
    } 
} 

Hoặc như thế này (với tập lệnh và vẫn chỉ _id truy vấn):

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "script": { 
      "script": "org.elasticsearch.index.mapper.Uid.splitUidIntoTypeAndId(new org.apache.lucene.util.BytesRef(doc['_uid'].value))[1].utf8ToString().contains('000ANT')" 
     } 
     } 
    } 
    } 
} 
+0

Tôi không thể thay đổi bản đồ của mình ngay bây giờ. – abi1964

+0

Sử dụng '_uid' sẽ cho bạn kết quả sai trong trường hợp bạn đang tìm kiếm những thứ khớp với tên' loại'.Ví dụ: tìm kiếm '" _uid ": { " giá trị ":". * Tác nhân. * " }' sẽ trả về mọi thứ. –

+0

Chúng ta có thể đạt được nó bằng cách sử dụng tập lệnh không? Một cái gì đó như '" script ":" (doc ['_ uid']. Value == '. * 0001MT_CAW18141225100. *') "' – abi1964

3

Bạn có thể sử dụng một wildcard query như thế này, mặc dù nó là đáng chú ý là nó không được khuyến cáo để bắt đầu một nhiệm kỳ đại diện với * như hiệu suất sẽ bị ảnh hưởng.

{ 
    "query": { 
    "wildcard": { 
     "_uid": "*000ANT*" 
    } 
    } 
} 

Cũng lưu ý rằng nếu hạn ký tự đại diện bạn đang tìm kiếm khớp với tên loại tài liệu của bạn, bằng cách sử dụng uid sẽ không hoạt động, như uid chỉ đơn giản là sự co của các loại và id: type#id

+0

;-) trên điều 'loại' ... –

+0

Loại bạn đang đề cập đến là gì? '" _type ":" agent ",' type luôn là 'agent' trong trường hợp của tôi .. – abi1964

+1

Vâng, đó là những gì tôi đang đề cập đến. Như đã lưu ý trong câu trả lời của tôi và Andrei, nếu ID bạn đang tìm kiếm bao gồm thuật ngữ "đại lý" vì bất kỳ lý do gì, thì sử dụng trường '_uid' trong truy vấn sẽ không hoạt động vì nó sẽ khớp với tất cả tài liệu. – Val

1

Bạn có hai lựa chọn ở đây, đầu tiên là sử dụng kết hợp từng phần, cách dễ nhất bằng cách gói một truy vấn với các ký tự đại diện tương tự như các câu trả lời khác. Điều này hoạt động trên các trường not_analyzed và phân biệt chữ hoa chữ thường.

POST /my_index/my_type/_search 
{ 
"query": { 
    "wildcard": { 
     "_id": { 
      "value": "*000ANT*" 
     } 
    } 
} 
} 

Tùy chọn thứ hai là sử dụng trình phân tích ElasticSearch và ánh xạ thích hợp để mô tả chức năng bạn đang tìm kiếm, bạn có thể đọc về những chức năng here.

Tiền đề cơ bản là bạn giới thiệu một máy phân tích trong ánh xạ của bạn có bộ mã thông báo, sẽ làm đứt chuỗi thành các mã nhỏ hơn để có thể khớp. Thực hiện tìm kiếm truy vấn đơn giản cho "000ANT" trên trường _id được mã hóa sẽ trả về tất cả kết quả bằng chuỗi đó.

Các vấn đề liên quan