Как сделать мой поиск нечувствительным к регистру? - PullRequest
0 голосов
/ 01 октября 2019

У меня есть веб-приложение, которое выполняет поиск по нескольким базам данных, некоторые сохраненные данные находятся в верхнем регистре, а некоторые в верхнем и нижнем регистре, однако при поиске по ключевому слову я хочу, чтобы он игнорировал регистр и просто выводил результаты, которыесоответствовать слову. например, я хочу выполнить поиск по «document_reference» без необходимости писать правильный способ его сохранения, то есть «Document_Reference»

Мне сказали добавить нечувствительность к регистру в мой индекс, но я не уверен, что делать или добавлять тудаЯ пытался это (нашел в документации Whoosh)

class CaseSensitivizer(analysis.Filter):
    def __call__(self, tokens):
        for t in tokens:
            yield t
            if t.mode == "index":
                low = t.text.lower()
                if low != t.text:
                    t.text = low
                    yield t

это то, что мой индекс и анализатор запросов выглядит как

def open_index(indexDirectory):
    # open index and return a idex object
    ix = index.open_dir(indexDirectory)
    return ix


def search_index(srch, ix):
    #  Search the index and print results
    #  ix = open_index(indexDirectory)
    results = ''
    lst = []
    qp = MultifieldParser(['Text', 'colname',
        'tblname', 'Length', 'DataType', 'tag_name'],
        schema=ix.schema, group=qparser.OrGroup)
    # qp = QueryParser('Text', schema=ix.schema)
    q = qp.parse(srch)
    with ix.searcher() as s:
        results = s.search(q, limit=None)
        for r in results:
            print('\n', r)
            lst.append(r.fields())
        if(DEBUG):
            print('Search Results:\n', lst)
            print('\nFinished in search.py')
        return lst

в настоящее время он только дает результаты, которые точно соответствуют тому, что я набралв строке поиска, поэтому, если я наберу «документ», но источник на самом деле хранится как «ДОКУМЕНТ», я не получу никаких результатов

1 Ответ

0 голосов
/ 01 октября 2019

вместо использования lower () или upper (), вы можете использовать casefold () для сравнения строк.

Очень хороший пример, приведенный здесь .

InКороче говоря, пример:

s1 = 'Apple'
s3 = 'aPPle'
s1.casefold() == s3.casefold()

возвращает True.

...