2015-03-05 10 views
13

I risultati restituiti dal pagliaio, utilizzando un backend elasticsearch, mi sembrano errati. Il mio indice di ricerca è la seguente:Non capisco i risultati restituiti da elasticsearch/haystack

from haystack import indexes 
from .models import IosVideo 

class VideoIndex(indexes.SearchIndex, indexes.Indexable):     
    text = indexes.CharField(document=True, use_template=True)    
    title = indexes.CharField(model_attr='title')       
    absolute_url = indexes.CharField(model_attr='get_absolute_url')   
# content_auto = indexes.EdgeNgramField(model_attr='title')    
    description = indexes.CharField(model_attr='description')    
# thumbnail = indexes.CharField(model_attr='thumbnail_url', null=True) 

    def get_model(self):              
     return IosVideo              

    def index_queryset(self, using=None):         
     return self.get_model().objects.filter(private=False) 

mio documento di testo si presenta come:

{{ object.title }} 
{{ object.text }} 
{{ object.description }} 

La mia domanda è

SearchQuerySet().models(IosVideo).filter(content="darby")[0] 

Il risultato che è il ritorno che mi fa pensare questo non funziona è un oggetto video con le seguenti caratteristiche

title: u'Cindy Daniels' 
description: u'', 
text: u'Cindy Daniels\n\n\n', 
absolute_url: u'/videos/testimonial/cindy-daniels/' 

Perché nel mondo la query restituisce un risultato del genere? Sono molto confuso.

La mia teoria corrente è che esso rende token ogni sottoinsieme del carattere nella query e lo utilizza come corrispondenza parziale. C'è un modo per ridurre questa tolleranza per essere più vicini.

mie info pip è elasticsearch == 1.2.0 django-pagliaio == 2.3.1

E il numero di versione è 1.3.1 elasticsearch

Inoltre quando ho colpito il server locale con http://localhost:9200/haystack/_search/?q=darby&pretty

Restituisce 10 risultati.

SearchQuerySet().filter(content="darby") 

Restituisce 4 risultati.

Qualcuno sa cosa potrebbe causare questo tipo di comportamento?

+0

Sei, per caso, utilizzando elasticstack o un analizzatore personalizzato? Questo potrebbe spiegare i risultati che stai vedendo. Sono sicuro che tu abbia visto, ma la ricerca di default nel filtro di Haystack 2.X è 'contains', piuttosto che' exact'. Questo, oltre a un analizzatore che analizza le parole parziali, potrebbe potenzialmente corrispondere a quel documento. –

+0

Nessun analizzatore personalizzato :(il mio pip è simile a questo elasticsearch == 1.2, django-haystack == 2.3.1 La versione elasticsearch è 1.3.1 – user2734679

+0

Hai provato a interrogare elasticsearch per confrontare i risultati? Ad esempio 'http:// localhost: 9200/_search /? q = darby' dove 'search' è il tuo nome indice –

risposta

4

C'è un problema con il metodo filter() sugli indici Charfield per django-haystack 2.1.0. Puoi invece cambiarli in NgramField, ad esempio text = indexes.NgramField(document=True, template_name=True).

Il problema è che quando si utilizza questa combinazione si ottiene solo il primo carattere. Quindi restituisce tutte le corrispondenze che hanno una 'd' nel loro campo indice di testo.

Problemi correlati