クロールによって Web ページ情報を保存するためのフィールド (id、タイトル、url、コンテンツ) を持つインデックスを作成しました。今、私はそのインデックスを複数の単語クエリ(ブールクエリも)で検索し、効率的な検索アルゴリズム(いくつかの例)と効率的な解析を提案したいと考えています。助けてください
質問する
407 次
1 に答える
0
タイトルだけを検索しますか、それともコンテンツも検索しますか? URL やコンテンツを返すタイトルの部分検索を許可すると仮定すると、スキーマは次のようになります。
schema = Schema(id=ID(stored=True), title=NGRAM(minsize=2, maxsize=20,stored=True, sortable=ranking_col), url=STORED(), content=STORED())
これは、最大 1000000 タイトルまでの標準の Whoosh サーチャーで問題なく動作します。エントリが増えると、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))
これは部分文字列検索では機能しませんが、数百万のドキュメントにうまく対応できます (コンテンツのサイズによって異なります)。
1,000 万件までのドキュメントをインデックス化するには、コンテンツをある種の DB に個別に保存し、whoosh で ID のみを検索する必要があります。
于 2013-10-22T12:36:24.620 に答える