سؤال

لقد بدأت للتو دمج البحث في السبات مع تطبيق السبات الخاص بي. يتم فهرسة البيانات باستخدام جلسة السبات في كل مرة أبدأ فيها الخادم.

FullTextSession fullTextSession = Search.getFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();

List books = session.createQuery("from Book as book").list();
for (Book book : books) {
    fullTextSession.index(book);
}

tx.commit(); //index is written at commit time     

إنه محرج للغاية ويستغرق الخادم 10 دقائق للبدء. هل أفعل هذا في الطريق الصحيح؟

كتبت جدولة ستقوم بتحديث الفهارس بشكل دوري. هل سيقوم هذا بتحديث إدخالات الفهرس الموجودة تلقائيا، أو إنشاء مؤشرات مكررة؟

هل كانت مفيدة؟

المحلول

على النحو المفصل في دليل البحث السبات، القسم 3.6.1، إذا كنت تستخدم التعليقات التوضيحية (الآن الافتراضي)، يتم تسجيل المستمعين الذين يطلقون الفهرسة في المتجر افتراضيا:

يتم تمكين البحث الإسبات من المربع عند استخدام التعليقات التوضيحية السبات أو EntityManager. إذا، لسبب ما تحتاج إلى تعطيلها، قم بتعيين hibernate.search.autoregister_listeners إلى False.

مثال على كيفية تشغيلها باليد:

 hibConfiguration.setListener("post-update", new FullTextIndexEventListener());
 hibConfiguration.setListener("post-insert", new FullTextIndexEventListener());
 hibConfiguration.setListener("post-delete", new FullTextIndexEventListener());

كل ما عليك فعله هو Annotate الكيانات التي تريد فهرستها مع

@Indexed(index = "fulltext")

التعليق التوضيحي، ثم قم بإلغاء التعليق الروحجي الجميل في الحقول، كما هو مفصل في دليل المستخدم.

لذلك يجب أن لا يجب أن تطلق فهرسة باليد عند تخزينها، ولا إعادة تحديد فهرسة Whae يبدأ التطبيق، إلا إذا كان لديك كيانات تم تخزينها قبل تمكين الفهرسة.

قد تحصل على مشاكل في الأداء عند تخزين كائن نقول لديه "مرفق" وهكذا فإنك فهرسة في نفس نطاق المعاملة التي تخزن الكيان. انظر هنا:

البحث في السبات واستخراج النص دون اتصال

للحل الذي يحل هذه المشكلة.

نصائح أخرى

بشرط أن تستخدمك fsdirectoryprovider (وهو الافتراضي) يستمر مؤشر Lucene على القرص. هذا يعني أنه لا توجد حاجة للفهرسة عند بدء التشغيل للغاية. إذا كان لديك قاعدة بيانات موجودة، فأنت تريد بالطبع لإنشاء فهرس أولي باستخدام وظائف FullTextSession.Index (). ومع ذلك، لا ينبغي أن يكون هذا في بدء تشغيل التطبيق. النظر في تعريض نوع ما من url الزناد، أو واجهة المسؤول. بمجرد أن يكون لديك الفهرس الأولي، أود أن أوصي باستخدام الفهرسة التلقائية. هذا يعني أن مؤشر Lucene يحصل على تحديث تلقائيا إذا تم إنشاء كتب / محدثة / محدثة. يجب أيضا تمكين الفهرسة التلقائي بشكل افتراضي.

أوصي بالرجوع إلى أقسام الفهرسة التلقائية والدليلية في الدليل عبر الإنترنت - http://docs.jboss.org/hibernate/stable/search/reference/en/html_single.

- هاردي

أنا حاليا استخدام الفهرسة التلقائية للبحث عن السبات مع JPA ويعمل بشكل جيد حقا. لإنشاء الفهارس الخاصة بك في البداية، يمكنك فقط استدعاء ما يلي:

    FullTextEntityManager fullTextEntityManager = 
                    Search.getFullTextEntityManager(entityManager);

    try {
       fullTextEntityManager.createIndexer().startAndWait();
    } catch (InterruptedException e) {
       // Exception handling
    }

حيث "EntityManager" هو مجرد javax.persistence.entitymanager. سيقوم أعلاه بفهرسة جميع الحقول التي تحمل علامة @ الموجودة في جميع الكيانات التي تم وضع علامة عليها

ثم طالما أنك تقوم بجميع التحديثات الخاصة بك، إلخ، من خلال مدير الكيان يتم تحديث الفهارس تلقائيا. يمكنك بعد ذلك البحث حسب المعتاد ولكن تأكد من إعادة إنشاء EntityManager على كل بحث (يمكنك استخدام EntityManAgerfactory للقيام بذلك).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top