# -*- coding: utf-8 -*-
from django.conf import settings
-from lucene import SimpleFSDirectory, IndexWriter, CheckIndex, \
+from lucene import SimpleFSDirectory, IndexWriter, IndexWriterConfig, CheckIndex, \
File, Field, Integer, \
NumericField, Version, Document, JavaError, IndexSearcher, \
QueryParser, PerFieldAnalyzerWrapper, \
from librarian.parser import WLDocument
from lxml import etree
import catalogue.models
-from pdcounter.models import Author as PDCounterAuthor
+from pdcounter.models import Author as PDCounterAuthor, BookStub as PDCounterBook
from multiprocessing.pool import ThreadPool
from threading import current_thread
import atexit
analyzer = WLAnalyzer()
self.analyzer = analyzer
- def open(self, analyzer=None):
+ def open(self, timeout=None):
if self.index:
raise Exception("Index is already opened")
- self.index = IndexWriter(self.store, self.analyzer,\
- IndexWriter.MaxFieldLength.LIMITED)
+ conf = IndexWriterConfig(Version.LUCENE_34, self.analyzer)
+ if timeout:
+ conf.setWriteLockTimeout(long(timeout))
+ self.index = IndexWriter(self.store, conf)
return self.index
def optimize(self):
doc.add(NumericField("tag_id", Field.Store.YES, True).setIntValue(int(pdtag.id)))
doc.add(Field("tag_name", pdtag.name, Field.Store.NO, Field.Index.ANALYZED))
doc.add(Field("tag_name_pl", pdtag.name, Field.Store.NO, Field.Index.ANALYZED))
- doc.add(Field("tag_category", 'pdcounter', Field.Store.NO, Field.Index.NOT_ANALYZED))
+ doc.add(Field("tag_category", 'pd_author', Field.Store.YES, Field.Index.NOT_ANALYZED))
+ doc.add(Field("is_pdcounter", 'true', Field.Store.YES, Field.Index.NOT_ANALYZED))
+ self.index.addDocument(doc)
+
+ for pdtag in PDCounterBook.objects.all():
+ doc = Document()
+ doc.add(NumericField("tag_id", Field.Store.YES, True).setIntValue(int(pdtag.id)))
+ doc.add(Field("tag_name", pdtag.title, Field.Store.NO, Field.Index.ANALYZED))
+ doc.add(Field("tag_name_pl", pdtag.title, Field.Store.NO, Field.Index.ANALYZED))
+ doc.add(Field("tag_category", 'pd_book', Field.Store.YES, Field.Index.NOT_ANALYZED))
doc.add(Field("is_pdcounter", 'true', Field.Store.YES, Field.Index.NOT_ANALYZED))
self.index.addDocument(doc)
book_doc.add(elem)
else:
book_doc.add(f)
-
self.index.addDocument(book_doc)
del book_doc
"""
index = None
- def open(self, analyzer=None, threads=4):
+ def open(self, analyzer=None, **kw):
if ReusableIndex.index:
self.index = ReusableIndex.index
else:
print("opening index")
- Index.open(self, analyzer)
+ Index.open(self, analyzer, **kw)
ReusableIndex.index = self.index
atexit.register(ReusableIndex.close_reusable)
self.book_id = int(stored.get("book_id"))
pd = stored.get("published_date")
- if pd is None:
- pd = 0
- self.published_date = int(pd)
+ try:
+ self.published_date = int(pd)
+ except ValueError:
+ self.published_date = 0
header_type = stored.get("header_type")
# we have a content hit in some header of fragment
for found in tops.scoreDocs:
doc = self.searcher.doc(found.doc)
is_pdcounter = doc.get('is_pdcounter')
- if is_pdcounter:
- tag = PDCounterAuthor.objects.get(id=doc.get('tag_id'))
+ category = doc.get('tag_category')
+ if is_pdcounter == 'true':
+ if category == 'pd_author':
+ tag = PDCounterAuthor.objects.get(id=doc.get('tag_id'))
+ elif category == 'pd_book':
+ tag = PDCounterBook.objects.get(id=doc.get('tag_id'))
+ tag.category = 'pd_book' # make it look more lik a tag.
+ else:
+ print "Warning. cannot get pdcounter tag_id=%d from db; cat=%s" % (int(doc.get('tag_id')), category)
else:
tag = catalogue.models.Tag.objects.get(id=doc.get("tag_id"))
# don't add the pdcounter tag if same tag already exists