python autocomplete n-gram whoosh

python - Cómo usar n-grams en whoosh



autocomplete (1)

Resolví este problema creando dos campos separados. Uno para la búsqueda real y otro para las sugerencias. El tipo de campo NGRAM o NGRAMWORDS se puede usar para la funcionalidad de "búsqueda difusa". En tu caso, sería algo como esto:

# not sure how your schema looks like exactly schema = Schema( title=NGRAMWORDS(minsize=2, maxsize=10, stored=True, field_boost=1.0, tokenizer=None, at=''start'', queryor=False, sortable=False) content=TEXT(stored=True), url=title=ID(stored=True), spelling=TEXT(stored=True, spelling=True)) # typeahead field if not os.path.exists("index"): os.mkdir("index") ix = create_in("index", schema) ix = open_dir("index") writer = ix.writer() q = MyTable.select() for item in q: print ''adding %s'' % item.Title writer.add_document(title=item.Title, content=item.content, url = item.URL) writer.add_document(spelling=item.Title) # adding item title to typeahead field self.addContentToSpelling(writer, item.content) # some method that adds some content words to typeheadfield if needed. The same way as above. writer.commit()

Entonces cuando para la búsqueda:

origQueryString = ''my search string'' words = self.splitQuery(origQueryString) # use tokenizers / analyzers or self implemented queryString = origQueryString # would be better to actually create a query corrector = ix.searcher().corrector("spelling") for word in words: suggestionList = corrector.suggest(word, limit=self.limit) for suggestion in suggestionList: queryString = queryString + " " + suggestion # would be better to actually create a query parser = QueryParser("title", ix.schema) myquery = parser.parse(querystring) with ix.searcher() as searcher: results = searcher.search(myquery) print len(results) for r in results: print r

Espero que entiendas la idea.

Estoy tratando de usar n-grams para obtener búsquedas de "autocompletar" usando Whoosh. Lamentablemente, estoy un poco confundido. He hecho un índice como este:

if not os.path.exists("index"): os.mkdir("index") ix = create_in("index", schema) ix = open_dir("index") writer = ix.writer() q = MyTable.select() for item in q: print ''adding %s'' % item.Title writer.add_document(title=item.Title, content=item.content, url = item.URL) writer.commit()

Luego busco el campo de título de esta manera:

querystring = ''my search string'' parser = QueryParser("title", ix.schema) myquery = parser.parse(querystring) with ix.searcher() as searcher: results = searcher.search(myquery) print len(results) for r in results: print r

y eso funciona genial Pero quiero utilizar esto en autocompletar y no coincide con palabras parciales (por ejemplo, buscar "hormiga" devolvería "hormiga", pero no "antílope" u "oso hormiguero"). Eso, por supuesto, dificulta en gran medida su uso para autocompletar. La página de Whoosh dice que debes usar esto:

analyzer = analysis.NgramWordAnalyzer() title_field = fields.TEXT(analyzer=analyzer, phrase=False) schema = fields.Schema(title=title_field)

Pero estoy confundido por eso. Parece ser solo "el medio" del proceso, cuando construyo mi índice ¿tengo que incluir el campo de título como un campo NGRAM (en lugar de TEXTO)? ¿Y cómo hago una búsqueda? Entonces, cuando busco "hormiga", obtengo ["hormiga", "oso hormiguero", "antílope"], etc.