flask_whooshalchemyplus index_all () не работает - PullRequest
0 голосов
/ 21 января 2020

Я хочу использовать flask_whooshalchemyplus для ручной индексации двух таблиц с именами "Traduzioni" и "TraduzioniDlg" для полной индексации. Я создал простую конечную точку на Flask, вызванную запросом JQuery ajax. Процесс останавливается практически без каких-либо исключений. Таблицы содержат текст на английском языке Engli sh, итальянском и арабском c, думаю, это может быть связано с ошибкой. Как я могу управлять различными кодировками с Whoo sh?

## FILE views.py
from app import app
# ....
import whoosh
import flask_whooshalchemyplus
from flask_whooshalchemyplus import index_all

# .... A LOT OF STUFF HERE

@app.route("/createIndexes", methods=['GET'])
@login_required
def createIndexes():
    d = ""
    try:
        index_all(app)
    except e:
        d = e
    stjson = {'mimetype':'application/json', 'status_code':200, "rows":d}
    return jsonify(resp=stjson)

1) На консоли Firefox не возвращается статус xhr.

2) На стороне сервера (Pythonanywhere) возникает ошибка 499, вот вывод:

93.41.1.147 - archeo [21 / Jan / 2020: 15: 22: 49 +0000] "GET / createIndexes HTTP / 1.1" 499 0 "https://fabioquintilii.pythonanywhere.com/admin" "Mozilla / 5.0 (X11; Ubuntu; Linux x86_64; rv: 67.0) Gecko / 20100101 Firefox / 67.0 "Время отклика" 93.41.1.147 "= 8.700

3) Журнал сервера останавливается после обработки первой таблицы:" 2020-01-21 15:22:40 Indexing Traduzioni .. . "

4) В папке search.db / папка имеет следующую структуру:

.
├── Traduzioni
│   ├── MAIN.tmp
│   │   ├── 3izw6phrod2o1ojvhs55ymaywukg.ctmp
│   │   ├── kkfrncvehj353od2zr7qdfz0ype7.ctmp
│   │   └── ogkmwxvb86vl3od6kwm533d3l658.ctmp
│   ├── MAIN_1kzdbfhp5z2389ms.pst
│   ├── MAIN_1kzdbfhp5z2389ms.trm
│   ├── MAIN_1kzdbfhp5z2389ms.vps
│   ├── MAIN_23qeml6mtoagefdb.pst
│   ├── MAIN_23qeml6mtoagefdb.trm
│   ├── MAIN_23qeml6mtoagefdb.vps
│   ├── MAIN_87ifp68y3amsfxmo.pst
│   ├── MAIN_87ifp68y3amsfxmo.trm
│   ├── MAIN_87ifp68y3amsfxmo.vps
│   ├── MAIN_WRITELOCK
│   └── _MAIN_0.toc
├── TraduzioniDlg
│   └── _MAIN_0.toc
└── tree.txt

3 directories, 16 files

Ответы [ 2 ]

1 голос
/ 24 января 2020

Попробуйте изменить время ожидания по вашему запросу xhr. Другой альтернативой может быть не запуск индексирования из веб-запроса, а выполнение его из консоли, чтобы вам было легче видеть, что он делает.

0 голосов
/ 25 января 2020

Большое спасибо Гленну и Филипу за ваши предложения! У меня было слишком короткое время ожидания, я исправил проблему в $ .AjaxSetup ()

$.ajaxSetup({delay:6000, timeout:9000}); -> $.ajaxSetup({delay:6000, timeout:30000});

Я попытался глубоко изучить whoo sh и изменил свой код следующим образом:

class TranslationSchema:
    # a class to create different schema
    TS_SCHEMA_TYPE_TEXT = 1

    def text_schema(self):
        return Schema(content=TEXT(analyzer=StemmingAnalyzer()))

    def get_schema(self, schema_type):
        if schema_type == self.TS_SCHEMA_TYPE_TEXT:
            return self.text_schema()

class IndexManager:
    def __init__(self,app):
        self.app = app

    def create_all_indexes(self):
        #all classes in module
        all_models = self.app.extensions['sqlalchemy'].db.Model._decl_class_registry.values()
        # __searchable__ class only
        models = [i for i in all_models if hasattr(i, '__searchable__')]

        schema = TranslationSchema()
        # delete existing index directory and created a new one with the same name
        if os.path.isdir(os.environ['WHOOSH_BASE']):
            rmtree(os.environ['WHOOSH_BASE'])
            os.mkdir(os.environ['WHOOSH_BASE'])
        else:
            os.mkdir(os.environ['WHOOSH_BASE'])
        # index created
        ix_text = create_in(os.environ['WHOOSH_BASE'], schema.get_schema(schema.TS_SCHEMA_TYPE_TEXT), indexname="text_search")
        # writer created
        writer_text = ix_text.writer()
        # adding documents to index
        for model in models:
            record = model.query.all()
            for rec in record:
                writer_text.add_document(content = unicode(rec.testo))
        writer_text.commit()


        return

Индекс создается с деревом, как показано ниже, файл * .seg имеет размер 1.1M. Может ли он быть правильным?

search.db/
├── _text_search_1.toc
├── text_search_2uo7ujdyypb7n3se.seg <-- 1.1M
└── text_search_WRITELOCK

0 directories, 3 files
...