2013-05-06 27 views
7

Tôi đang sử dụng ndb.Model. Các Search API có các lớp lĩnh vực sau đây:Công cụ ứng dụng của Google - Sử dụng Python API tìm kiếm với các trường danh sách

TextField : plain text 
    HtmlField : HTML formatted text 
    AtomField : a string which is treated as a single token 
    NumberField : a numeric value (either float or integer) 
    DateField : a date with no time component 
    GeoField : a locale based on latitude and longitude 

Giả sử tôi có một trường 'thẻ' mà là một trường danh sách:

tags = ndb.StringProperty(repeated=True) 

Làm sao tôi phải đối xử với lĩnh vực này với search.Document?

Ngay bây giờ tôi đang chuyển danh sách tags thành một chuỗi:

t = '|'.join(tags) 

Và sau đó:

search.TextField(name=cls.TAGS, value=t) 

Bất kỳ lời đề nghị?

+0

Một vài câu hỏi. 1. Tại sao sử dụng tìm kiếm văn bản cho các thẻ, điều đó phù hợp với các truy vấn kho dữ liệu. 2, Tại sao ghép nối với '|' tại sao không phải ký tự không gian –

+0

Hey Tim. 1. Tôi muốn người dùng có thể nhập một từ vào trường tìm kiếm biểu mẫu và sử dụng nó để tìm kiếm thông qua các trường khác nhau. Giả sử anh ta vào 'Carpenter', kết quả sẽ bao gồm 'Carpenter' như một từ khóa (ví dụ một công việc) và 'Carpenter' là họ. 2. Tôi đang nối bằng cách sử dụng đường ống vì có thể có hai thẻ từ như 'Trình đọc Chuyên nghiệp'. –

+0

Datastore không phù hợp nếu bạn muốn thực hiện công đoàn hoặc nút giao của thẻ. – moraes

Trả lời

6

Sử dụng số nhận dạng duy nhất cho mỗi "thẻ". Sau đó, bạn có thể tạo một tài liệu như:

số
doc = search.Document(fields=[ 
    search.TextField(name='tags', value='tag1 tag2 tag3'), 
]) 
search.Index(name='tags').put(doc) 

Bạn thậm chí có thể sử dụng (id) như dây đàn:

doc = search.Document(fields=[ 
    search.TextField(name='tags', value='123 456 789'), 
]) 

Và truy vấn sử dụng các nhà khai thác như bạn muốn:

index = search.Index(name='tags') 
results = index.search('tags:(("tag1" AND "tag2") OR ("tag3" AND "tag4"))') 
+0

Cảm ơn, moraes, tôi sẽ thử điều đó. –

5

Bạn nên thêm bao nhiêu trường dưới dạng 'thẻ' bạn có, tất cả có cùng field_name:

doc = search.Document(fields=[ 
    search.TextField(name='tag', value=t) for t in tags 
]) 

Như trong tài liệu:

Trường chỉ có thể chứa một giá trị, phải phù hợp với loại trường. Tên trường không nhất thiết phải là duy nhất. Một tài liệu có thể có nhiều trường có cùng tên và cùng một loại, đó là cách để biểu diễn một trường có nhiều giá trị. (Tuy nhiên, các trường ngày và số có cùng tên không thể lặp lại.) Một tài liệu cũng có thể chứa nhiều trường có cùng tên và các kiểu trường khác nhau.

+2

Đây thực sự là phương pháp được khuyến nghị. LƯU Ý: bảng điều khiển dành cho quản trị viên hiện không hiển thị nhiều trường có cùng tên ... do đó, nó sẽ xuất hiện chỉ có "trường cuối cùng" được thêm vào ... khi thực tế, tất cả chúng đều ở đó –

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