2014-04-17 89 views
2

我構建了一個數據庫,我希望能夠使用GAE中的Search API進行搜索。我點擊了Google上關於API的教程,但我缺少的一件事是如何將數據存儲類型轉換爲「文檔」。有什麼好的教程嗎?謝謝如何在我的GAE數據存儲上實現搜索API?

+1

編寫的代碼拷貝屬性值從數據存儲實體到搜索API文檔。 –

回答

3

db.Model ndb.Model不能轉換爲search.Document。

爲什麼?因爲它沒有太多的價值。

我給你一些例子 - 你有字符串「這-是黑標籤」在db.StringProperty()如何將它轉換:

  1. 你可以使用它作爲原子 - 所以比賽將是如果完全匹配
  2. 您可以將其用作字符串 - 因此它會被分成'this','is','black','tag',而不是標記爲't','th','thi','this 」 ...
  3. 您可以決定是不可見的,因爲在搜索忍不住給虛假點擊

您需要自己設計搜索功能,它應該是手動設計,即答案

你只需要:

  1. 創建search.Document
  2. 添加字段
  3. 添加文檔索引

閱讀參考:https://developers.google.com/appengine/docs/python/search/documentclass

0

不幸的是,這是不可能的。

看看索引構造函數(python),我們可以確定在早期階段實現了一些嘗試,但它從未真正起作用。指定索引的來源現在已經被棄用了一段時間,並且不再工作。

這裏的構造是pydoc:(?)

class Index(object): 
    [...] 

    def __init__(self, name, namespace=None, source=SEARCH): 
    """Initializer. 

    Args: 
    name: The name of the index. An index name must be a visible printable 
     ASCII string not starting with '!'. Whitespace characters are excluded. 
    namespace: The namespace of the index name. If not set, then the current 
     namespace is used. 
    source: Deprecated as of 1.7.6. The source of 
     the index: 
     SEARCH - The Index was created by adding documents throught this 
      search API. 
     DATASTORE - The Index was created as a side-effect of putting entities 
      into Datastore. 
     CLOUD_STORAGE - The Index was created as a side-effect of adding 
      objects into a Cloud Storage bucket. 
    [...] 
    """ 

因此,至少就目前而言,唯一的解決辦法,就像Tim Hoffman提到的,是從你的數據存儲的數據分別處理您的文件和索引。

您仍然可以向https://code.google.com/p/googleappengine/issues/list提交功能請求,並在那裏發送。

0

我有成千上萬的實體,我想建立一個索引,然後使用mapreduce爲我的實體構建索引,並且可以通過搜索API進行搜索。 MapReduce的工作是

- name: buildindex 
    mapper: 
    input_reader: mapreduce.input_readers.DatastoreInputReader 
    handler: main.buildindex 
    params: 
    - name: entity_kind 
     default: main.Article 

功能

def buildindex(entity): 
    try: 
     doc = search.Document(doc_id=str(entity.key()), fields=[ 
      search.TextField(name='title', value=entity.title), 
      search.TextField(name='text', value=entity.text), 
        ]) 
       search.Index(name='myIndex').put(doc) 

    except Exception, e: 
     logging.exception('Mapreduce has exception:%s' % str(e))