2013-10-05 3 views
0

Я создал индекс с полями (id, title, url, content) для хранения информации веб-страницы путем сканирования. Теперь я хочу искать этот индекс с несколькими запросами слов (также булевыми запросами), предлагать хорошие эффективные поисковые алгоритмы (некоторые примеры) и эффективный синтаксический анализ. Пожалуйста, помогитеэффективный логический поиск большого индекса с whoosh

ответ

0

Вы хотите найти только заголовок или содержание? Предполагая, что вы хотите разрешить частичный поиск по названию, которые возвращают URL и/или содержание, схема будет выглядеть так:

schema = Schema(id=ID(stored=True), title=NGRAM(minsize=2, maxsize=20,stored=True, sortable=ranking_col), url=STORED(), content=STORED()) 

Это прекрасно работает со стандартным Свистом поисковиком до ~ 1000000 названий. Для большего количества записей индекс ngram станет очень большим и медленным.

Кроме того, использование стоп-слов, чтобы уменьшить размер индекса:

stopwords = set(['of', 'by', 'the','in','for','a']) #words to be excluded from the index  
def create_whoosh(self): 
    writer = ix.writer() 
    for t in documents: 
     words = [t for t in t.title.split(" ") if t not in stopwords] #remove stopwords 
     writer.add_document(title=" ".join(words), url=t.url, content=t.content) 
    writer.commit()  

Искатель:

def lookup(self, terms): 
with ix.searcher() as src: 
     query = QueryParser("term", ix.schema).parse(terms) 
     results = src.search(query, limit=30) 
     return [[r['url'],r['content']] for r in results] 

Если поиск полных слов в названии и содержании предназначен, вы можете сделать:

schema = Schema(id=ID(stored=True), title=TEXT(stored=True), url=STORED(), content=TEXT(stored=True)) 

Это не будет работать для поиска подстроки, но может хорошо справиться с некоторыми миллионами документов (в зависимости от n размер содержимого)

Для индексирования ~ 10 миллионов документов вам нужно отдельно хранить содержимое в каком-то БД и искать только идентификатор с whoosh.

Смежные вопросы