2013-10-23 14 views
6

Potrzebuję wyszukiwania wartości podłańcuchowych w polu modelu. Mam indeks i SearchQuerySet.Nie działa autouzupełnianie z EdgeNgramField przy użyciu stogu siana i silnika Elasticsearch (Django)

To jest konfiguracja Elasticsearch.

HAYSTACK_CONNECTIONS = { 
    'default': { 
     'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 
     'URL': 'http://127.0.0.1:9200/', 
     'INDEX_NAME': 'haystack', 
    }, 

} 

Mój indeks.

class ElementIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 

    #model fields 
    title_element = indexes.EdgeNgramField(model_attr='title') 
    clean_content = indexes.EdgeNgramField(model_attr='clean_content') 
    def get_model(self): 
     return Element 

    def index_queryset(self, using=None): 
     """Used when the entire index for model is updated.""" 
     return Element.objects.filter(updatetime__lte=datetime.datetime.now()) 

Moje wyszukiwanie niestandardowe.

SearchQuerySet().filter(title_element=clean_value) 

W mojej bazy danych mam wartość „HolaMundoTest”, a jeśli staram się wyszukiwać według „Hola” lub „HolaM” Uważam wynik, ale gdy próbuję „Mundo” lub „Mundo” lub ' laMun "nie ma meczów.

Co jest nie tak? Nie rozumiem.

źródło http://django-haystack.readthedocs.org/en/v2.1.0/autocomplete.html

Używam:

  • -django 1.5.1
  • -django-stogu == 2.1.0
  • -elasticsearch-0.90.5
  • - pyelasticsearch == 0,6

Dziękuję za Twój ans wers-

Odpowiedz

4

Ponieważ używasz EdgeNgramField, który jest oczekiwanym zachowaniem, ponieważ tokenizuje na białych znakach i dopasowuje tekst zaczynający się od znaków w zapytaniu.

Aby uzyskać wyniki dla zapytania "laMun" lub "mundo", powinieneś użyć NgramField zamiast EdgeNgramField.

Powiązane problemy