![JAR search and dependency download from the Maven repository](/logo.png)
net.intelie.live.plugins.messenger.search.SearchServiceImpl Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of plugin-messenger Show documentation
Show all versions of plugin-messenger Show documentation
Intelie Live Messenger Plugin
The newest version!
package net.intelie.live.plugins.messenger.search;
import com.google.common.collect.Sets;
import net.intelie.live.Live;
import net.intelie.live.plugins.messenger.search.document.SearchableDoc;
import net.intelie.live.plugins.messenger.search.document.SearchableDocImpl;
import net.intelie.pipes.types.Type;
import net.intelie.pipes.util.Preconditions;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.LongPoint;
import org.apache.lucene.document.NumericDocValuesField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexableField;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.store.FSDirectory;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Closeable;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
import static net.intelie.live.plugins.messenger.search.SearchableFields.*;
public class SearchServiceImpl implements SearchService, Closeable {
private static final Logger LOGGER = LoggerFactory.getLogger(SearchServiceImpl.class);
private final List searchableEvents = new CopyOnWriteArrayList<>();
private final FSDirectory fsDirectory;
private final IndexWriter indexWriter;
private final SearcherManager searcherManager;
private final ControlledRealTimeReopenThread reopenThread;
private final SearchableIndexWriter searchableIndexWriter;
private final Live live;
public SearchServiceImpl(@NotNull Live live) throws Exception {
this(live, 30.0, 0.7);
}
public SearchServiceImpl(@NotNull Live live, Double targetMaxStaleSec, Double targetMinStaleSec) throws Exception {
this.live = live;
Path path = live.system().getDataDirectory().resolve("search");
Files.createDirectories(path);
LOGGER.info("Lucene Directory -> {}", path.toString());
fsDirectory = FSDirectory.open(path);
live.describeAction("Opened index directory " + fsDirectory, fsDirectory);
indexWriter = new IndexWriter(fsDirectory, new IndexWriterConfig());
live.describeAction("Opened index writer", indexWriter);
searchableIndexWriter = new SearchableIndexWriterBase();
searcherManager = new SearcherManager(indexWriter, null);
live.describeAction("Opened searcher manager", searcherManager);
reopenThread = new ControlledRealTimeReopenThread<>(indexWriter, searcherManager, targetMaxStaleSec, targetMinStaleSec);
reopenThread.setName("fulltext index reopen thread");
reopenThread.setDaemon(true);
live.describeAction("Started fulltext index reopen thread", reopenThread);
live.system().requestScheduledExecutor(1, "search update last indexed info").scheduleAtFixedRate(this::commitSettingInfo, 1, 1, TimeUnit.MINUTES);
reopenThread.start();
}
@Override
public void close() throws IOException {
try (IndexWriter ignored1 = this.indexWriter;
SearcherManager ignored2 = searcherManager;
ControlledRealTimeReopenThread ignored3 = this.reopenThread) {
}
}
@Override
public synchronized AutoCloseable registerSearchableEventHandler(@NotNull SearchableEventHandler searchableEventHandler) throws Exception {
Preconditions.checkState(searchableEvents.stream().noneMatch(handlerBase -> handlerBase.searchableName().equals(searchableEventHandler.searchableName())), "already registered");
SearchableEventBase handlerBase = new SearchableEventBase(live, searchableIndexWriter, searchableEventHandler);
searchableEvents.add(handlerBase);
handlerBase.startIndexing();
LOGGER.error("registering searchable handler for -> {}", handlerBase.searchableName());
return () -> {
searchableEvents.remove(handlerBase);
handlerBase.close();
};
}
@Override
public void restartIndexing() throws Exception {
indexWriter.flush();
for (SearchableEventBase searchableEvent : searchableEvents) {
searchableEvent.restartIndexing();
}
}
@Override
public Set searchableFields() {
Set retSet = new HashSet<>();
for (SearchableEventBase searchableEvent : searchableEvents) {
retSet.addAll(searchableEvent.searchableFields());
}
return retSet;
}
@Override
public int searchCount(String query) throws Exception {
IndexSearcher searcher = searcherManager.acquire();
try {
return searcher.count(query(query, null, null));
} finally {
searcherManager.release(searcher);
}
}
@Override
public Collection
© 2015 - 2025 Weber Informatics LLC | Privacy Policy