2012-10-15 44 views
12

Sử dụng GAE search API có thể tìm kiếm kết quả khớp một phần không?Kết hợp từng phần API tìm kiếm GAE

Tôi đang cố gắng tạo chức năng tự động hoàn thành trong đó cụm từ sẽ là một từ một phần. ví dụ.

> b
> bui
> xây dựng

sẽ tất cả trở lại "xây dựng".

Làm thế nào điều này có thể xảy ra với GAE?

Trả lời

27

Mặc dù câu lệnh LIKE (kết hợp từng phần) không được hỗ trợ trong Tìm kiếm văn bản đầy đủ, nhưng bạn có thể hack xung quanh nó.

Thứ nhất, tokenize chuỗi dữ liệu cho tất cả các chuỗi con có thể (hello = h, anh, hel, lo vv)

def tokenize_autocomplete(phrase): 
    a = [] 
    for word in phrase.split(): 
     j = 1 
     while True: 
      for i in range(len(word) - j + 1): 
       a.append(word[i:i + j]) 
      if j == len(word): 
       break 
      j += 1 
    return a 

Xây dựng một chỉ số + tài liệu (Search API) sử dụng chuỗi tokenized

index = search.Index(name='item_autocomplete') 
for item in items: # item = ndb.model 
    name = ','.join(tokenize_autocomplete(item.name)) 
    document = search.Document(
     doc_id=item.key.urlsafe(), 
     fields=[search.TextField(name='name', value=name)]) 
    index.put(document) 

Thực hiện tìm kiếm và walah!

results = search.Index(name="item_autocomplete").search("name:elo") 

https://code.luasoftware.com/tutorials/google-app-engine/partial-search-on-gae-with-search-api/

+0

này hoạt động tốt. Tôi đã quản lý chức năng search.index của Ferris để tự động mã hóa tất cả các trường văn bản (thay đổi một dòng) và nó "chỉ hoạt động". Chỉ cần không cố gắng hiển thị trường đã nói cho người dùng trực tiếp từ kết quả tìm kiếm;) –

+1

Tôi cũng đã thêm 'name.lower()' vì tôi gặp một số vấn đề lạ với ngôn ngữ tiếng Nga: Tôi không thể tìm thấy mã thông báo như vậy. –

+8

lưu ý thân thiện: cụm từ là "voila!" –

2

Như được mô tả tại Full Text Search and LIKE statement, không có điều gì là không thể, vì API tìm kiếm triển khai lập chỉ mục toàn văn.

Hy vọng điều này sẽ hữu ích!

0

Tôi có cùng một vấn đề để kiểm soát typeahead, và giải pháp của tôi là phân tích cú pháp chuỗi để một phần nhỏ:

name='hello world' 
name_search = ' '.join([name[:i] for i in xrange(2, len(name)+1)]) 
print name_search; 
# -> he hel hell hello hello hello w hello wo hello wor hello worl hello world 

Hy vọng điều này giúp đỡ

2

giống như @Desmond Lua câu trả lời , nhưng với chức năng tokenize khác nhau:

 
def tokenize(word): 
    token=[] 
    words = word.split(' ') 
    for word in words: 
    for i in range(len(word)): 
     if i==0: continue 
     w = word[i] 
     if i==1: 
     token+=[word[0]+w] 
     continue 

     token+=[token[-1:][0]+w] 

    return ",".join(token) 

nó sẽ phân tích hello worldhe,hel,hell,hello,wo,wor,worl,world.

rất tốt cho mục đích ánh sáng autocomplete

0

phiên bản của tôi được tối ưu hóa: không lặp lại tokens

def tokenization(text): 
    a = [] 
    min = 3 
    words = text.split() 
    for word in words: 
     if len(word) > min: 
      for i in range(min, len(word)): 
       token = word[0:i] 
       if token not in a: 
        a.append(token) 
    return a 
+0

Vui lòng thêm mô tả khác về câu trả lời đã đăng của bạn. –