| | |
| | | public class LuceneService implements Runnable {
|
| | |
|
| | |
|
| | | private static final int INDEX_VERSION = 5;
|
| | | private static final int INDEX_VERSION = 6;
|
| | |
|
| | | private static final String FIELD_OBJECT_TYPE = "type";
|
| | | private static final String FIELD_PATH = "path";
|
| | |
| | | private static final String CONF_ALIAS = "aliases";
|
| | | private static final String CONF_BRANCH = "branches";
|
| | |
|
| | | private static final Version LUCENE_VERSION = Version.LUCENE_46;
|
| | | private static final Version LUCENE_VERSION = Version.LUCENE_4_10_0;
|
| | |
|
| | | private final Logger logger = LoggerFactory.getLogger(LuceneService.class);
|
| | |
|
| | |
| | | * Synchronously indexes a repository. This may build a complete index of a
|
| | | * repository or it may update an existing index.
|
| | | *
|
| | | * @param name
|
| | | * @param displayName
|
| | | * the name of the repository
|
| | | * @param repository
|
| | | * the repository object
|
| | |
| | | // close all writers
|
| | | for (String writer : writers.keySet()) {
|
| | | try {
|
| | | writers.get(writer).close(true);
|
| | | writers.get(writer).close();
|
| | | } catch (Throwable t) {
|
| | | logger.error("Failed to close Lucene writer for " + writer, t);
|
| | | }
|
| | |
| | | // skip non-annotated tags
|
| | | continue;
|
| | | }
|
| | | if (!tags.containsKey(tag.getObjectId())) {
|
| | | if (!tags.containsKey(tag.getReferencedObjectId().getName())) {
|
| | | tags.put(tag.getReferencedObjectId().getName(), new ArrayList<String>());
|
| | | }
|
| | | tags.get(tag.getReferencedObjectId().getName()).add(tag.displayName);
|
| | |
| | | }
|
| | |
|
| | | // finished
|
| | | reader.release();
|
| | | reader.close();
|
| | |
|
| | | // commit all changes and reset the searcher
|
| | | config.setInt(CONF_INDEX, null, CONF_VERSION, INDEX_VERSION);
|
| | |
| | | String q = MessageFormat.format(pattern, SearchObjectType.blob.name(), branch, path);
|
| | |
|
| | | BooleanQuery query = new BooleanQuery();
|
| | | StandardAnalyzer analyzer = new StandardAnalyzer(LUCENE_VERSION);
|
| | | QueryParser qp = new QueryParser(LUCENE_VERSION, FIELD_SUMMARY, analyzer);
|
| | | StandardAnalyzer analyzer = new StandardAnalyzer();
|
| | | QueryParser qp = new QueryParser(FIELD_SUMMARY, analyzer);
|
| | | query.add(qp.parse(q), Occur.MUST);
|
| | |
|
| | | IndexWriter writer = getIndexWriter(repositoryName);
|
| | |
| | | // skip non-annotated tags
|
| | | continue;
|
| | | }
|
| | | if (!tags.containsKey(tag.getObjectId())) {
|
| | | if (!tags.containsKey(tag.getObjectId().getName())) {
|
| | | tags.put(tag.getReferencedObjectId().getName(), new ArrayList<String>());
|
| | | }
|
| | | tags.get(tag.getReferencedObjectId().getName()).add(tag.displayName);
|
| | |
| | | IndexWriter indexWriter = writers.get(repository);
|
| | | File repositoryFolder = FileKey.resolve(new File(repositoriesFolder, repository), FS.DETECTED);
|
| | | File indexFolder = new File(repositoryFolder, LUCENE_DIR);
|
| | | Directory directory = FSDirectory.open(indexFolder);
|
| | | Directory directory = FSDirectory.open(indexFolder.toPath());
|
| | |
|
| | | if (indexWriter == null) {
|
| | | if (!indexFolder.exists()) {
|
| | | indexFolder.mkdirs();
|
| | | }
|
| | | StandardAnalyzer analyzer = new StandardAnalyzer(LUCENE_VERSION);
|
| | | IndexWriterConfig config = new IndexWriterConfig(LUCENE_VERSION, analyzer);
|
| | | StandardAnalyzer analyzer = new StandardAnalyzer();
|
| | | IndexWriterConfig config = new IndexWriterConfig(analyzer);
|
| | | config.setOpenMode(OpenMode.CREATE_OR_APPEND);
|
| | | indexWriter = new IndexWriter(directory, config);
|
| | | writers.put(repository, indexWriter);
|
| | |
| | | return null;
|
| | | }
|
| | | Set<SearchResult> results = new LinkedHashSet<SearchResult>();
|
| | | StandardAnalyzer analyzer = new StandardAnalyzer(LUCENE_VERSION);
|
| | | StandardAnalyzer analyzer = new StandardAnalyzer();
|
| | | try {
|
| | | // default search checks summary and content
|
| | | BooleanQuery query = new BooleanQuery();
|
| | | QueryParser qp;
|
| | | qp = new QueryParser(LUCENE_VERSION, FIELD_SUMMARY, analyzer);
|
| | | qp = new QueryParser(FIELD_SUMMARY, analyzer);
|
| | | qp.setAllowLeadingWildcard(true);
|
| | | query.add(qp.parse(text), Occur.SHOULD);
|
| | |
|
| | | qp = new QueryParser(LUCENE_VERSION, FIELD_CONTENT, analyzer);
|
| | | qp = new QueryParser(FIELD_CONTENT, analyzer);
|
| | | qp.setAllowLeadingWildcard(true);
|
| | | query.add(qp.parse(text), Occur.SHOULD);
|
| | |
|
| | |
| | | Query rewrittenQuery = searcher.rewrite(query);
|
| | | logger.debug(rewrittenQuery.toString());
|
| | |
|
| | | TopScoreDocCollector collector = TopScoreDocCollector.create(5000, true);
|
| | | TopScoreDocCollector collector = TopScoreDocCollector.create(5000);
|
| | | searcher.search(rewrittenQuery, collector);
|
| | | int offset = Math.max(0, (page - 1) * pageSize);
|
| | | ScoreDoc[] hits = collector.topDocs(offset, pageSize).scoreDocs;
|
| | |
| | | content = "";
|
| | | }
|
| | |
|
| | | int tabLength = storedSettings.getInteger(Keys.web.tabLength, 4);
|
| | | int fragmentLength = SearchObjectType.commit == result.type ? 512 : 150;
|
| | |
|
| | | QueryScorer scorer = new QueryScorer(query, "content");
|
| | |
| | | if (fragment.length() > fragmentLength) {
|
| | | fragment = fragment.substring(0, fragmentLength) + "...";
|
| | | }
|
| | | return "<pre class=\"text\">" + StringUtils.escapeForHtml(fragment, true) + "</pre>";
|
| | | return "<pre class=\"text\">" + StringUtils.escapeForHtml(fragment, true, tabLength) + "</pre>";
|
| | | }
|
| | |
|
| | | // make sure we have unique fragments
|
| | |
| | | */
|
| | | private class MultiSourceReader extends MultiReader {
|
| | |
|
| | | MultiSourceReader(IndexReader [] readers) {
|
| | | MultiSourceReader(IndexReader [] readers) throws IOException {
|
| | | super(readers, false);
|
| | | }
|
| | |
|