App Engine搜索API(文档搜索) - 多种语言

use*_*502 6 search google-app-engine google-search-api

我有文件,我想用3种不同的语言搜索.由于我可以有多个具有相同名称/类型的字段,因此以下文档结构有效(这是一个简化示例).

document = search.Document(
    fields=[
      search.TextField(
        name="name",
        language="en",
        value="dog"),
      search.TextField(
        name="name",
        language="es",
        value="perro"),
      search.TextField(
        name="name",
        language="fr",
        value="chien")
    ]
  )
  index = search.Index("my_index")
  index.put(document)
Run Code Online (Sandbox Code Playgroud)

指定语言有助于Google标记化的价值TextField.

以下查询全部工作,每个返回一个结果:

print index.search("name: dog")
print index.search("name: perro")
print index.search("name: chien")
Run Code Online (Sandbox Code Playgroud)

这是我的问题:我可以将搜索限制为仅使用特定语言的目标字段吗?

目的是避免得到假阳性结果.由于每种语言都使用阿拉伯字母,因此使用西班牙语进行全文搜索的人可能会看到不相关的英语结果.

谢谢.

Fra*_*son 2

您可以使用构面将实际未出现在文档中的字段(元数据)添加到文档中。这些将指示文档中出现的语言。

文档插入:

    index = search.Index("my_index")
    document = search.Document(
        fields=[
          search.TextField(
            name="name",
            language="en",
            value="dog"),
          search.TextField(
            name="name",
            language="es",
            value="perro"),
          search.TextField(
            name="name",
            language="fr",
            value="chien")
        ],
        facets=[
           search.AtomFacet(name='lang', value='en'),
           search.AtomFacet(name='lang', value='es'),
           search.AtomFacet(name='lang', value='fr'),
        ],
      )
    index.put(document)
    document = search.Document(
        fields=[
          search.TextField(
            name="name",
            language="es",
            value="gato"),
          search.TextField(
            name="name",
            language="fr",
            value="chat")
        ],
        facets=[
           # no english in this document so leave out lang='en'
           search.AtomFacet(name='lang', value='es'),
           search.AtomFacet(name='lang', value='fr'),
        ],
      )
    index.put(document)
Run Code Online (Sandbox Code Playgroud)

询问:

index = search.Index("my_index")
query = search.Query(
    '', # query all documents, cats and dogs.
    # filter docs by language facet
    facet_refinements=[
        search.FacetRefinement('lang', value='en'),
    ])

results = index.search(query)
for doc in results:
    result = {}
    for f in doc.fields:
        # filter fields by language
        if f.language == 'en':
            result[f.name] = f.value
    print result
Run Code Online (Sandbox Code Playgroud)

应该打印{u'name': u'dog'}.

请注意,虽然我们只能获取包含英语的文档,但我们仍然需要过滤掉这些文档中其他语言的字段。这就是为什么我们迭代这些字段时只将英文字段添加到result.

如果您想更多地了解分面搜索的更一般用例,这个答案给出了一个很好的主意。