我想在Heroku上爲我的網站使用此解決方案,這樣我就可以使用MongoDB進行索引了嗎?任何人都知道一本很好的教程或書籍,它提供了一個深入示例如何執行這個?谷歌搜索並沒有真正爲我提供任何東西。使用MongoDB實現一個目錄提供程序進行hibernate搜索
謝謝。
我想在Heroku上爲我的網站使用此解決方案,這樣我就可以使用MongoDB進行索引了嗎?任何人都知道一本很好的教程或書籍,它提供了一個深入示例如何執行這個?谷歌搜索並沒有真正爲我提供任何東西。使用MongoDB實現一個目錄提供程序進行hibernate搜索
謝謝。
我在這花了很長時間,因爲我對Mongo DB是如此的陌生,並沒有計劃使用它,直到它看起來像Heroku上的搜索實現的一個很好的解決方案。我想我會添加這個答案來幫助任何想要做同樣事情的人。
我使用的代碼從設在這裏了Lucene蒙戈DB項目:
https://github.com/mongoutils/mongo-lucene
然後創建了以Lucene的蒙戈DB接口的項目我自己的Hibernate Search的目錄提供類。我使用org.hibernate.search.store.impl.RAMDirectoryProvider類作爲大綱。
所有這就是剩下要做的就是讓你的Hibernate配置指向你的新類:
hibernate.search.default.directory_provider=com.foo.MongoLuceneDirectoryProvider
這裏是我MongoLuceneDirectoryProvider類:
package com.foo.MongoLuceneDirectoryProvider
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.Properties;
import java.util.concurrent.ConcurrentMap;
import org.apache.log4j.Logger;
import org.apache.lucene.store.Directory;
import org.hibernate.search.SearchException;
import org.hibernate.search.indexes.impl.DirectoryBasedIndexManager;
import org.hibernate.search.spi.BuildContext;
import org.hibernate.search.store.DirectoryProvider;
import org.hibernate.search.store.impl.DirectoryProviderHelper;
import com.github.mongoutils.collections.DBObjectSerializer;
import com.github.mongoutils.collections.MongoConcurrentMap;
import com.github.mongoutils.collections.SimpleFieldDBObjectSerializer;
import com.github.mongoutils.lucene.MapDirectory;
import com.github.mongoutils.lucene.MapDirectoryEntry;
import com.github.mongoutils.lucene.MapDirectoryEntrySerializer;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
public class MongoLuceneDirectoryProvider implements DirectoryProvider<Directory> {
private Logger log = Logger.getLogger(MongoLuceneDirectoryProvider.class);
private Directory directory;
private String indexName;
private Properties properties;
@Override
public void initialize(String directoryProviderName, Properties properties, BuildContext context) {
indexName = directoryProviderName;
this.properties = properties;
Mongo mongo;
try {
mongo = new Mongo("localhost");
DB db = mongo.getDB("testdb");
DBCollection dbCollection = db.getCollection("testcollection");
DBObjectSerializer<String> keySerializer = new SimpleFieldDBObjectSerializer<String>("key");
DBObjectSerializer<MapDirectoryEntry> valueSerializer = new MapDirectoryEntrySerializer("value");
ConcurrentMap<String, MapDirectoryEntry> store = new MongoConcurrentMap<String, MapDirectoryEntry>(dbCollection, keySerializer, valueSerializer);
directory = new MapDirectory(store);
}
catch (UnknownHostException e) {
log.error("While attempting to initalize Mongo directory provider", e);
}
catch (MongoException e) {
log.error("While attempting to initalize Mongo directory provider", e);
}
catch (IOException e) {
log.error("While attempting to initalize Mongo directory provider", e);
}
}
@Override
public void start(DirectoryBasedIndexManager indexManager) {
try {
directory.setLockFactory(DirectoryProviderHelper.createLockFactory(null, properties));
properties = null;
DirectoryProviderHelper.initializeIndexIfNeeded(directory);
}
catch (IOException e) {
throw new SearchException("Unable to initialize index: " + indexName, e);
}
}
@Override
public void stop() {
try {
directory.close();
}
catch (IOException e) {
log.error("While attempting to stop directory provider", e);
}
}
@Override
public Directory getDirectory() { return this.directory; }
}
如果你想幫助實現它(我的意思是創建Java代碼來支持此配置),請加入我們的談話在更合適的郵件列表:
http://lists.jboss.org/pipermail/hibernate-dev/2013-January/009329.html
訂閱點擊這裏:
https://lists.jboss.org/mailman/listinfo/hibernate-dev
它應該是直接編碼來集成一些現有的組件。
的小費好感謝 –