@Override public void modifyIndex(final IndexWriter writer, final IndexSearcher searcher) throws ModifyKnowledgeBaseException { for (final Map.Entry<String, HashMap<String, String>> entry : this.attributes.entrySet()) { final String key = entry.getKey(); final HashMap<String, String> hash = entry.getValue(); final QueryParser qp = new QueryParser(this.docPrimaryKey, new DoserIDAnalyzer()); try { final TopDocs top = searcher.search(qp.parse(QueryParserBase.escape(key)), 1); final ScoreDoc[] scores = top.scoreDocs; if (scores.length > 0) { final Document doc = new Document(); final Document currentDoc = searcher.getIndexReader().document(scores[0].doc); // BugFix create new Document und copy Fields. final List<IndexableField> fields = currentDoc.getFields(); for (final IndexableField field : fields) { if (field.stringValue() != null) { if (field.name().equalsIgnoreCase(docPrimaryKey)) { doc.add(new StringField(field.name(), field.stringValue(), Field.Store.YES)); } else { doc.add(new TextField(field.name(), field.stringValue(), Field.Store.YES)); } } } final List<Document> docListToAdd = new LinkedList<Document>(); docListToAdd.add(doc); for (final Map.Entry<String, String> subentry : hash.entrySet()) { final IndexableField field = doc.getField(subentry.getKey()); if (field == null) { throw new ModifyKnowledgeBaseException("UpdateField no found", null); } if (this.action.equals(KBModifications.OVERRIDEFIELD)) { doc.removeFields(subentry.getKey()); String[] newentries = generateSeperatedFieldStrings(subentry.getValue()); for (int i = 0; i < newentries.length; i++) { doc.add(new TextField(subentry.getKey(), newentries[i], Field.Store.YES)); } } else if (this.action.equals(KBModifications.UPDATERELATEDLABELS)) { doc.removeFields(subentry.getKey()); doc.add(updateOccurrences(subentry.getValue(), field, "surroundinglabels")); } else if (this.action.equals(KBModifications.UPDATEOCCURRENCES)) { doc.removeFields(subentry.getKey()); IndexableField f = updateOccurrences(subentry.getValue(), field, "occurrences"); doc.add(f); } } writer.updateDocuments(new Term(this.docPrimaryKey, key), docListToAdd); } else { throw new ModifyKnowledgeBaseException("Document not found", null); } } catch (final IOException e) { throw new ModifyKnowledgeBaseException("IOException in IndexSearcher", e); } catch (ParseException e) { throw new ModifyKnowledgeBaseException("Queryparser Exception", e); } } }
private ListMultimap<String, TextHit> query( Node property, String queryString, int limit, ExecutionContext execCxt) { // use the graph information in the text index if possible if (textIndex.getDocDef().getGraphField() != null && execCxt.getActiveGraph() instanceof GraphView) { GraphView activeGraph = (GraphView) execCxt.getActiveGraph(); if (!Quad.isUnionGraph(activeGraph.getGraphName())) { String uri = activeGraph.getGraphName() != null ? TextQueryFuncs.graphNodeToString(activeGraph.getGraphName()) : Quad.defaultGraphNodeGenerated.getURI(); String escaped = QueryParserBase.escape(uri); String qs2 = textIndex.getDocDef().getGraphField() + ":" + escaped; queryString = "(" + queryString + ") AND " + qs2; } } // for language-based search extension if (textIndex.getDocDef().getLangField() != null) { String field = textIndex.getDocDef().getLangField(); if (langArg != null) { String qs2 = !"none".equals(langArg) ? field + ":" + langArg : "-" + field + ":*"; queryString = "(" + queryString + ") AND " + qs2; } } Explain.explain(execCxt.getContext(), "Text query: " + queryString); if (log.isDebugEnabled()) log.debug("Text query: {} ({})", queryString, limit); String cacheKey = limit + " " + property + " " + queryString; Cache<String, ListMultimap<String, TextHit>> queryCache = (Cache<String, ListMultimap<String, TextHit>>) execCxt.getContext().get(cacheSymbol); if (queryCache == null) { /* doesn't yet exist, need to create it */ queryCache = CacheFactory.createCache(CACHE_SIZE); execCxt.getContext().put(cacheSymbol, queryCache); } final String queryStr = queryString; // final needed for the lambda function ListMultimap<String, TextHit> results = queryCache.getOrFill( cacheKey, () -> { List<TextHit> resultList = textIndex.query(property, queryStr, limit); ListMultimap<String, TextHit> resultMultimap = LinkedListMultimap.create(); for (TextHit result : resultList) { resultMultimap.put(result.getNode().getURI(), result); } return resultMultimap; }); return results; }
/** * Escapes an extension field. The default implementation is equivalent to {@link * QueryParser#escape(String)}. * * @param extfield the extension field identifier * @return the extension field identifier with all special chars escaped with a backslash * character. */ public String escapeExtensionField(String extfield) { return QueryParserBase.escape(extfield); }