我有文件,我想用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")
以下是我的问题:我可以将搜索限制为仅定位具有特定语言的字段吗?
目的是避免误报结果。由于每种语言都使用阿拉伯字母,因此使用西班牙语进行全文搜索的人可能会看到不相关的英语结果。
谢谢。
答案 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