2014-05-20 29 views
7

Tôi đang cố gắng thực hiện tổng hợp cụm từ bằng cách sử dụng tìm kiếm đàn hồi cho dữ liệu bên dưới với truy vấn sau, đầu ra sẽ chia tên thành mã thông báo (xem kết quả bên dưới). Vì vậy, tôi đã cố gắng lập bản đồ os_name như multi_field và bây giờ tôi không thể truy vấn bằng nó. Có thể có chỉ mục không có mã thông báo không? chẳng hạn như "Fedora Core"?Kết hợp cụm từ tìm kiếm đàn hồi

Query:

GET /temp/example/_search 
{ 
    "size": 0, 
    "aggs": { 
    "OS": { 
     "terms": { 
      "field": "os_name" 
     } 
    } 
    } 
} 

dữ liệu:

... 
    { 
     "_index": "temp", 
     "_type": "example", 
     "_id": "3", 
     "_score": 1, 
     "_source": { 
      "title": "system3", 
      "os_name": "Fedora Core", 
      "os_version": 18 
     } 
    }, 
    { 
     "_index": "temp", 
     "_type": "example", 
     "_id": "1", 
     "_score": 1, 
     "_source": { 
      "title": "system1", 
      "os_name": "Fedora Core", 
      "os_version": 20 
     } 
    }, 
    { 
     "_index": "temp", 
     "_type": "example", 
     "_id": "2", 
     "_score": 1, 
     "_source": { 
      "title": "backup", 
      "os_name": "Yellow Dog", 
      "os_version": 6 
     } 
    } 
... 

Output:

 ... 
     { 
      "key": "core", 
      "doc_count": 2 
     }, 
     { 
      "key": "fedora", 
      "doc_count": 2 
     }, 
     { 
      "key": "dog", 
      "doc_count": 1 
     }, 
     { 
      "key": "yellow", 
      "doc_count": 1 
     } 
     ... 

MAPP ing:

PUT /temp 
{ 
    "mappings": { 
    "example": { 
     "properties": { 
     "os_name": { 
      "type": "string" 
     }, 
     "os_version": { 
      "type": "long" 
     }, 
     "title": { 
      "type": "string" 
     } 
     } 
    } 
    } 
} 
+0

xin vui lòng gửi bản đồ của bạn quá . – Thorsten

+0

Xin chào @Thorsten, tôi cũng đã thêm bản đồ. Cảm ơn. – codeBarer

Trả lời

6

Trên thực tế bạn nên thay đổi bản đồ của bạn như thế này

"os_name": { 
    "type": "string", 
    "fields": { 
    "raw": { 
     "type": "string", 
     "index": "not_analyzed" 
    } 
    } 
}, 

và aggs của bạn nên được thay đổi:

GET /temp/example/_search 
{ 
    "size": 0, 
    "aggs": { 
    "OS": { 
     "terms": { 
      "field": "os_name.raw" 
     } 
    } 
    } 
} 
4

Một giải pháp mà sẽ làm việc là để thiết lập các lĩnh vực để not_analyzed (Đọc thêm về nó trong the docs for attribute "index").

Giải pháp này sẽ không phân tích đầu vào nào cả, tùy thuộc vào yêu cầu của bạn mà bạn có thể muốn đặt custom analyzer, ví dụ: không phân chia các từ, nhưng viết chúng lại, để có được kết quả không phân biệt chữ hoa chữ thường.

curl -XDELETE localhost:9200/temp 
curl -XPUT localhost:9200/temp -d ' 
{ 
    "mappings": { 
    "example": { 
     "properties": { 
     "os_name": { 
      "type": "string", 
      "index" : "not_analyzed" 
     }, 
     "os_version": { 
      "type": "long" 
     }, 
     "title": { 
      "type": "string" 
     } 
     } 
    } 
    } 
}' 

curl -XPUT localhost:9200/temp/example/1 -d ' 
{ 
    "title": "system3", 
    "os_name": "Fedora Core", 
    "os_version": 18 
}' 

curl -XPUT localhost:9200/temp/example/2 -d ' 
{ 
    "title": "system1", 
    "os_name": "Fedora Core", 
    "os_version": 20 
}' 

curl -XPUT localhost:9200/temp/example/3 -d ' 
{ 
    "title": "backup", 
    "os_name": "Yellow Dog", 
    "os_version": 6 
}' 

curl -XGET localhost:9200/temp/example/_search?pretty=true -d ' 
{ 
    "size": 0, 
    "aggs": { 
    "OS": { 
     "terms": { 
      "field": "os_name" 
     } 
    } 
    } 
}' 

Output:

{ 
    "took" : 1, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 3, 
    "max_score" : 0.0, 
    "hits" : [ ] 
    }, 
    "aggregations" : { 
    "OS" : { 
     "buckets" : [ { 
     "key" : "Fedora Core", 
     "doc_count" : 2 
     }, { 
     "key" : "Yellow Dog", 
     "doc_count" : 1 
     } ] 
    } 
    } 
} 
+0

Rất tuyệt! Cảm ơn nhiều. Tôi không thực sự cần phân tích os_name ... Tôi nghĩ :) – codeBarer

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