Как сделать этот поиск по имени атрибута django лучше? - PullRequest
1 голос
/ 22 июня 2011
lcount = Open_Layers.objects.all()
form = SearchForm()

if request.method == 'POST': 
    form = SearchForm(request.POST) 
    if form.is_valid():
        data = form.cleaned_data
        val=form.cleaned_data['LayerName']

        a=Open_Layers()
        data = []
        for e in lcount:
            if e.Layer_name == val:     
                data = val 

        return render_to_response('searchresult.html', {'data':data})

    else:
        form = SearchForm()

 else:
    return render_to_response('mapsearch.html', {'form':form})

Это просто возвращает назад, если определенное «имя» совпадает.Как сделать так, чтобы он возвращался, когда я даю поиск «Парк», должен возвращаться Парк1, Парк2, Парковка, Паркин, т.е. все вхождения парка.

Ответы [ 3 ]

1 голос
/ 22 июня 2011

Вы можете улучшить свою логику поиска, используя list для накопления результатов и модуль re для соответствия большему набору слов.

Тем не менее, это все еще довольно ограничено, подвержено ошибкам и трудно поддерживать или даже сложнее развивать. Кроме того, вы никогда не получите такие хорошие результаты, как если бы вы использовали поисковую систему.

Таким образом, вместо того, чтобы пытаться заново изобрести колесо, автомобиль и шоссе, вы должны потратить некоторое время на настройку стога сена . Теперь это стандарт de facto для поиска в Django.

Сначала используйте woosh как бэкэнд, это будет проще. Если ваш поиск замедляется, замените его на solr.

EDIT:

Простая чистая альтернатива:

Open_Layers.objects.filter(name__icontains=val)

Это выполнит SQL LIKE, добавив% `для вас.

Это убьет вашу базу данных, если ее использовать слишком часто, но я думаю, что это, вероятно, не будет проблемой для вашего текущего проекта.

Кстати, вы, вероятно, хотите переименовать Open_Layers в OpenLayers, так как это соглашение об именах Python PEP8.

0 голосов
/ 03 августа 2012

Я понимаю, что это старый пост, но в любом случае:

В стандартной библиотеке python сравнение нечетких логических строк уже есть.

import difflib 

В основном взгляните на:

difflib.SequenceMatcher(None, a='string1', b='string2', autojunk=True).ratio()

подробнее здесь: http://docs.python.org/library/difflib.html#sequencematcher-objects

То, что он делает, возвращает отношение того, насколько близки две строки, от нуля до 1. Поэтому вместо проверки, равны ли они, вы выбрали коэффициент подобия.

На что нужно обратить внимание, вы можете преобразовать обе строки в нижний регистр.

string1.lower()

Также обратите внимание, что вы можете захотеть использовать ваш любимый метод разбиения строки, т.е. .split () или что-то с использованием re, чтобы поиск «David» против «David Brent» занимал более высокое место.

0 голосов
/ 22 июня 2011

Вместо

if e.Layer_name == val:     
   data = val 

используйте

if val in e.Layer_name:     
   data.append(e.Layer_name) 

(и вам не нужна строка data = form.cleaned_data)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...