2013-12-18 40 views
6

Podczas wyszukiwania indeksu wyszukiwania w wersji Python GAE Search API, jaka jest najlepsza praktyka wyszukiwania przedmiotów, w których dokumenty ze słowami pasującymi do tytułu są najpierw zwracane, a następnie dokumenty, w których słowa pasują do ciała?Interfejs API wyszukiwarki Google App Engine

Na przykład biorąc pod uwagę:

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), 
    ]) 

Jeśli jest to możliwe, jak można przeprowadzić wyszukiwanie na indeks Document s powyższego formularza z wyników zwróconych w tym priorytecie, gdzie wyrażenie poszukiwany jest w zmiennej qs:

  1. dokumentów, których title dopasowuje qs; następnie
  2. Dokumenty, których treść jest zgodna ze słowami qs.

Wygląda na to, że właściwym rozwiązaniem jest użycie MatchScorer, ale może to oznaczać, że nie korzystałem wcześniej z tej funkcji wyszukiwania. Z dokumentacji nie wynika jasno, jak korzystać z MatchScorer, ale zakładam, że jedna z nich jest podklasą i przeciąża jakąś funkcję - ale ponieważ nie jest to udokumentowane i nie zagłębiłem się w kod, nie mogę powiedzieć tego na pewno.

Czy jest tu coś, czego mi brakuje, czy jest to właściwa strategia? Czy tęsknię, gdzie tego rodzaju rzeczy są udokumentowane?


Tak dla jasności tutaj jest bardziej skomplikowany przykład pożądanego rezultatu:

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. 

Odpowiedz

3

scoring klienta jest jednym z naszych najlepszych wniosków fabularnych priorytetem. Mamy nadzieję, że mamy dobry sposób, aby zrobić to tak szybko, jak to możliwe.

W konkretnym przypadku można oczywiście osiągnąć pożądany wynik, wykonując dwa oddzielne zapytania: pierwszy z ograniczeniem pola "tytuł", a drugi z ograniczeniem "treść".

+0

Dzięki Alan. Myślałem o podwójnej kwerendie, jak sugerujesz, ale potem trzeba przecinać wyniki (aby nie uzyskiwać duplikatów) i śledzenie kursorów staje się nieco trudniejsze. Miałem nadzieję, że przeoczyłem coś prostego. Biorę tę odpowiedź jako poprawną, dopóki dobry sposób na to nie zostanie rozwiązany. Pozdrawiam –

+0

@Alan - Jakieś aktualizacje na ten temat? –

+1

@Alan - podskocz, jakieś wieści na ten temat? –