# -*- coding: utf-8 -*-
from django.conf import settings
-from lucene import SimpleFSDirectory, IndexWriter, CheckIndex, \
+from lucene import SimpleFSDirectory, NIOFSDirectory, 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
"""
def __init__(self):
self.make_index_dir()
- self.store = SimpleFSDirectory(File(settings.SEARCH_INDEX))
+ self.store = NIOFSDirectory(File(settings.SEARCH_INDEX))
def make_index_dir(self):
try:
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):
q = NumericRangeQuery.newIntRange("tag_id", 0, Integer.MAX_VALUE, True, True)
self.index.deleteDocuments(q)
- for tag in catalogue.models.Tag.objects.all():
+ for tag in catalogue.models.Tag.objects.exclude(category='set'):
doc = Document()
doc.add(NumericField("tag_id", Field.Store.YES, True).setIntValue(int(tag.id)))
doc.add(Field("tag_name", tag.name, Field.Store.NO, Field.Index.ANALYZED))
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 f in frags:
try:
- frag = catalogue.models.Fragment.objects.get(anchor=f[FRAGMENT])
+ frag = catalogue.models.Fragment.objects.get(anchor=f[FRAGMENT], book__id=self.book_id)
except catalogue.models.Fragment.DoesNotExist:
# stale index
continue
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