API поиска Google App Engine
При запросе поискового индекса в Python-версии API поиска GAE, каков наилучший метод для поиска элементов, в которых сначала возвращаются документы со словами, соответствующими названию, а затем документы, слова которых соответствуют основному тексту?
Например, учитывая:
body = """This is the body of the document,
with a set of words"""
my_document = search.Document(
fields=[
search.TextField(name='title', value='A Set Of Words'),
search.TextField(name='body', value=body),
])
Если это возможно, как можно выполнить поиск по индексу Document
s вышеупомянутой формы с результатами, возвращенными в этом приоритете, где искомая фраза находится в переменной qs
:
- Документы которых
title
соответствуетqs
; затем - Документы, тело которых соответствует
qs
слова.
Похоже, что правильным решением является использование MatchScorer
, но я могу быть не в курсе, так как я не использовал эту функцию поиска раньше. Из документации не ясно, как использовать MatchScorer
, но я предполагаю, что это один из подклассов и перегружает некоторую функцию - но поскольку это не задокументировано, и я не углубился в код, я не могу сказать наверняка.
Есть ли здесь что-то, чего мне не хватает, или это правильная стратегия? Я пропустил, где подобные вещи задокументированы?
Просто для наглядности приведу более сложный пример желаемого результата:
documents = [
dict(title="Alpha", body="A"), # "Alpha"
dict(title="Beta", body="B Two"), # "Beta"
dict(title="Alpha Two", body="A"), # "Alpha2"
]
for doc in documents:
search.Document(
fields=[
search.TextField(name="title", value=doc.title),
search.TextField(name="body", value=doc.body),
]
)
index.put(doc) # for some search.Index
# Then when we search, we search the Title and Body.
index.search("Alpha")
# returns [Alpha, Alpha2]
# Results where the search is found in the Title are given higher weight.
index.search("Two")
# returns [Alpha2, Beta] -- note Alpha2 has 'Two' in the title.
1 ответ
Пользовательский скоринг является одним из наших приоритетов. Мы надеемся найти хороший способ сделать что-то подобное как можно скорее.
В вашем конкретном случае вы, конечно, могли бы достичь желаемого результата, выполнив два отдельных запроса: первый с ограничением поля для "заголовка", а второй - для "тела".