Tôi có một số JSON trông giống như sau: Chúng ta hãy gọi đó là lĩnh vực metadataIndexing/Tìm kiếm "phức tạp" JSON trong elasticsearch
{
"somekey1": "val1",
"someotherkey2": "val2",
"more_data": {
"contains_more": [
{
"foo": "val5",
"bar": "val6"
},
{
"foo": "val66",
"baz": "val44"
},
],
"even_more": {
"foz" : 1234,
}
}
}
Đây chỉ là một ví dụ đơn giản. Người thực có thể phát triển phức tạp hơn. Phím có thể xuất hiện nhiều lần. Giá trị là tốt và có thể là int hoặc str.
Bây giờ vấn đề đầu tiên là tôi không hoàn toàn chắc chắn làm thế nào tôi phải chỉ số chính xác điều này trong elasticsearch vì vậy tôi có thể tìm thấy một cái gì đó với các yêu cầu cụ thể.
Tôi đang sử dụng Django/Haystack nơi chỉ số trông như thế này:
class FooIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
metadata = indexes.CharField(model_attr='get_metadata')
# and some more specific fields
Và mẫu:
{
"foo": {{ object.foo }},
"metadata": {{ object.metadata}},
# and some more
}
Các siêu dữ liệu sau đó sẽ được lấp đầy với các mẫu ở trên và kết quả sẽ trông như thế này:
{
"foo": "someValue",
"metadata": {
"somekey1": "val1",
"someotherkey2": "val2",
"more_data": {
"contains_more": [
{
"foo": "val5",
"bar": "val6"
},
{
"foo": "val66",
"baz": "val44"
},
],
"even_more": {
"foz" : 1234,
}
}
},
}
Mà sẽ đi vào cột 'văn bản' trong elasticsearch.
Vì vậy, mục tiêu bây giờ là có thể tìm kiếm cho những thứ như:
- foo: val5
- Foz: 12 *
- thanh: val *
- somekey1: VAL1
- và như vậy trên
Vấn đề thứ hai: Khi tôi tìm kiếm ví dụ: cho foo: val5 nó phù hợp với tất cả các đối tượng chỉ có khóa "foo" và tất cả các đối tượng có val5 ở một nơi khác trong cấu trúc của nó.
Đây là cách tôi tìm kiếm trong Django:
self.searchqueryset.auto_query(self.cleaned_data['q'])
Đôi khi kết quả là "okayish" đôi khi nó chỉ là hoàn toàn vô dụng.
Tôi có thể cần một con trỏ đúng hướng và tìm hiểu những sai lầm mà tôi đã thực hiện ở đây. Cảm ơn bạn!
Chỉnh sửa: Tôi đã thêm giải pháp cuối cùng của tôi làm câu trả lời bên dưới!
Lời nói đầu: Tôi không phải là người dùng django, chỉ là ES. Đoán của tôi: trường 'nội dung' được điền với tất cả dữ liệu, khiến cho không thể thực hiện các kết quả phù hợp với từng trường cụ thể.Nếu bạn muốn điều đó, bạn cần phải thể hiện rằng trong bộ lọc/truy vấn của bạn (nhưng tôi đoán là: không sử dụng 'auto_query'). – mark
trường siêu dữ liệu của bạn luôn có cấu trúc giống nhau không? –
@juliendangers Đôi khi nó có nhiều trường hoặc chứa nhiều phần tử trong mảng Và đôi khi không có mảng và nó có thể khá phẳng. Tuy nhiên, các khóa được biết trước và có thể có, ví dụ: lên đến 30 + những cái khác nhau – daddz