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

时间:2017-06-22 06:57:41

标签: google-app-engine search 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)

指定语言有助于Google对TextField的值进行标记。

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

print index.search("name: dog")
print index.search("name: perro")
print index.search("name: chien")

以下是我的问题:我可以将搜索限制为仅定位具有特定语言的字段吗?

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

谢谢。

2 个答案:

答案 0 :(得分:2)

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

文件插入:

    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)

查询:

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

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

请注意,虽然我们只能获取其中包含英语的文档,但我们仍然必须在这些文档中过滤掉其他语言的字段。这就是我们遍历字段的原因,只是将那些用英语添加到result

如果您想了解更多关于分面搜索的更一般用例,this answer给出了一个非常好的主意。

答案 1 :(得分:2)

您可以为每种语言使用单独的索引。

定义用于解析给定语言的正确索引的实用程序函数:

def get_index(lang):
   return search.Index("my_index_{}".format(lang))

插入文件:

document = search.Document(
    fields=[
      search.TextField(
        name="name",
        language="en",
        value="dog"),
    ])

get_index('en').put(document)

document = search.Document(
    fields=[
      search.TextField(
        name="name",
        language="fr",
        value="chien")
    ])

get_index('fr').put(document)

按语言查询:

query = search.Query(
    'name: chien')

results = get_index('fr').search(query)

for doc in results:
    print doc