2013-05-06 48 views
7

我正在使用ndb.Model。 搜索API具有以下字段類別:Google App Engine - 使用搜索API Python與列表字段

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 

假設我有一個「標籤」字段是列表字段:

tags = ndb.StringProperty(repeated=True) 

我怎麼看待這個領域與search.Document

現在我轉tags列表轉換爲字符串:

t = '|'.join(tags) 

然後:

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

有什麼建議?

+0

有幾個問題。 1.爲什麼使用文本搜索標籤,這適合數據存儲查詢。 2,爲什麼要連接'|'爲什麼不是空格字符 – 2013-05-07 00:12:52

+0

嘿蒂姆。 1.我希望用戶能夠在表單搜索字段中輸入一個單詞並使用它來搜索不同的字段。假設他輸入'Carpenter',結果將包括'Carpenter'作爲標籤(例如工作)和'Carpenter'作爲姓。 2.我正在使用管道連接,因爲可能會有兩個文字標籤,如「專業閱讀器」。 – 2013-05-07 00:27:57

+0

如果要執行標記的聯合或交點,數據存儲不適用。 – moraes 2013-05-09 05:32:31

回答

6

對每個「標籤」使用唯一標識符。然後,您可以創建這樣一個文件:

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

你甚至可以使用編號(ID)爲字符串:

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

和查詢使用運算符,如你所願:

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

謝謝,莫拉斯,我會試試看。 – 2013-05-12 02:39:54

5

你應該添加儘可能多的字段作爲'標籤'你有,所有使用相同的字段名稱:

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

正如在文檔中:

一個字段只能包含一個值,該值必須與該字段的類型相匹配。字段名稱不必是唯一的。文檔可以具有多個具有相同名稱和相同類型的字段,這是表示具有多個值的字段的一種方式。 (但是,具有相同名稱的日期和數字字段不能重複。)文檔還可以包含具有相同名稱和不同字段類型的多個字段。

+2

這確實是推薦的方法。注意:管理控制檯當前沒有顯示多個字段具有相同的名稱......所以它會顯示只有「最後一個字段」被添加了......實際上他們都在那裏 – 2014-05-03 19:56:09

相關問題