List of usage examples for org.apache.solr.common.params HighlightParams MAX_CHARS
String MAX_CHARS
To view the source code for org.apache.solr.common.params HighlightParams MAX_CHARS.
Click Source Link
From source file:com.o19s.solr.swan.highlight.SwanHighlighter.java
License:Apache License
private void doHighlightingByHighlighter(Query query, SolrQueryRequest req, NamedList docSummaries, int docId, Document doc, String fieldName) throws IOException { final SolrIndexSearcher searcher = req.getSearcher(); final IndexSchema schema = searcher.getSchema(); // TODO: Currently in trunk highlighting numeric fields is broken (Lucene) - // so we disable them until fixed (see LUCENE-3080)! // BEGIN: Hack final SchemaField schemaField = schema.getFieldOrNull(fieldName); if (schemaField != null && ((schemaField.getType() instanceof org.apache.solr.schema.TrieField) || (schemaField.getType() instanceof org.apache.solr.schema.TrieDateField))) return;//from w w w . j ava2s .c o m // END: Hack SolrParams params = req.getParams(); IndexableField[] docFields = doc.getFields(fieldName); List<String> listFields = new ArrayList<String>(); for (IndexableField field : docFields) { listFields.add(field.stringValue()); } String[] docTexts = listFields.toArray(new String[listFields.size()]); // according to Document javadoc, doc.getValues() never returns null. check empty instead of null if (docTexts.length == 0) return; TokenStream tokenStream; int numFragments = getMaxSnippets(fieldName, params); boolean mergeContiguousFragments = isMergeContiguousFragments(fieldName, params); List<TextFragment> frags = new ArrayList<TextFragment>(); TermOffsetsTokenStream tots = null; // to be non-null iff we're using TermOffsets optimization try { // TokenStream tvStream = TokenSources.getTokenStream(searcher.getIndexReader(), docId, fieldName); // if (tvStream != null) { // tots = new TermOffsetsTokenStream(tvStream); // } } catch (IllegalArgumentException e) { // No problem. But we can't use TermOffsets optimization. } for (int j = 0; j < docTexts.length; j++) { if (tots != null) { // if we're using TermOffsets optimization, then get the next // field value's TokenStream (i.e. get field j's TokenStream) from tots: tokenStream = tots.getMultiValuedTokenStream(docTexts[j].length()); } else { // fall back to analyzer tokenStream = createAnalyzerTStream(schema, fieldName, docTexts[j]); } int maxCharsToAnalyze = params.getFieldInt(fieldName, HighlightParams.MAX_CHARS, Highlighter.DEFAULT_MAX_CHARS_TO_ANALYZE); Highlighter highlighter; if (Boolean.valueOf(req.getParams().get(HighlightParams.USE_PHRASE_HIGHLIGHTER, "true"))) { if (maxCharsToAnalyze < 0) { tokenStream = new CachingTokenFilter(tokenStream); } else { tokenStream = new CachingTokenFilter( new OffsetLimitTokenFilter(tokenStream, maxCharsToAnalyze)); } // get highlighter highlighter = getPhraseHighlighter(query, fieldName, req, (CachingTokenFilter) tokenStream); // after highlighter initialization, reset tstream since construction of highlighter already used it tokenStream.reset(); } else { // use "the old way" highlighter = getHighlighter(query, fieldName, req); } if (maxCharsToAnalyze < 0) { highlighter.setMaxDocCharsToAnalyze(docTexts[j].length()); } else { highlighter.setMaxDocCharsToAnalyze(maxCharsToAnalyze); } try { TextFragment[] bestTextFragments = highlighter.getBestTextFragments(tokenStream, docTexts[j], mergeContiguousFragments, numFragments); for (int k = 0; k < bestTextFragments.length; k++) { if ((bestTextFragments[k] != null) && (bestTextFragments[k].getScore() > 0)) { frags.add(bestTextFragments[k]); } } } catch (InvalidTokenOffsetsException e) { throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e); } } // sort such that the fragments with the highest score come first Collections.sort(frags, new Comparator<TextFragment>() { public int compare(TextFragment arg0, TextFragment arg1) { return Math.round(arg1.getScore() - arg0.getScore()); } }); // convert fragments back into text // TODO: we can include score and position information in output as snippet attributes String[] summaries = null; if (frags.size() > 0) { ArrayList<String> fragTexts = new ArrayList<String>(); for (TextFragment fragment : frags) { if ((fragment != null) && (fragment.getScore() > 0)) { fragTexts.add(fragment.toString()); } if (fragTexts.size() >= numFragments) break; } summaries = (String[]) fragTexts.toArray(); if (summaries.length > 0) docSummaries.add(fieldName, summaries); } // no summeries made, copy text from alternate field if (summaries == null || summaries.length == 0) { alternateField(docSummaries, params, doc, fieldName); } }
From source file:nl.knaw.huygens.facetedsearch.AbstractSolrServer.java
License:Open Source License
@Override public Map<String, Object> search(FacetedSearchParameters<?> fsp) throws IndexException { ElaborateSearchParameters sp = (ElaborateSearchParameters) fsp; Log.info("searchparameters={}", sp); queryComposer.compose(sp);//from w w w. jav a 2 s . co m String queryString = queryComposer.getSearchQuery(); String[] facetFields = getFacetFields(sp); // Log.debug("search({},{})", queryString, sp.getSort()); Map<String, String> textFieldMap = sp.getTextFieldsToSearch(); SolrQuery query = new SolrQuery(); String[] fieldsToReturn = getIndexFieldToReturn(sp.getResultFields()); query.setQuery(queryString)// .setFields(fieldsToReturn)// .setRows(ROWS)// .addFacetField(facetFields)// .setFacetMinCount(1)// .setFacetLimit(FACET_LIMIT); if (queryComposer.mustHighlight()) { query// .setHighlight(true)// .setHighlightSnippets(500)// .setHighlightFragsize(HIGHLIGHT_FRAGSIZE); query.set(HighlightParams.MERGE_CONTIGUOUS_FRAGMENTS, false); query.set(HighlightParams.MAX_CHARS, -1); query.set(HighlightParams.FIELDS, textFieldMap.keySet().toArray(new String[textFieldMap.size()])); query.set(HighlightParams.Q, queryComposer.getHighlightQuery()); } query = setSort(query, sp); Map<String, Object> data = getSearchData(sp, facetFields, query, fieldsToReturn); return data; }
From source file:org.alfresco.repo.search.impl.solr.SolrQueryHTTPClient.java
License:Open Source License
protected void buildHightlightParameters(SearchParameters searchParameters, URLCodec encoder, StringBuilder url) throws UnsupportedEncodingException { if (searchParameters.getHighlight() != null) { url.append("&").append(HighlightParams.HIGHLIGHT + "=true"); url.append("&" + HighlightParams.HIGHLIGHT + ".q=") .append(encoder.encode(searchParameters.getSearchTerm(), "UTF-8")); if (searchParameters.getHighlight().getSnippetCount() != null) { url.append("&").append(HighlightParams.SNIPPETS + "=") .append(searchParameters.getHighlight().getSnippetCount()); }//from www . ja v a 2 s.c om if (searchParameters.getHighlight().getFragmentSize() != null) { url.append("&").append(HighlightParams.FRAGSIZE + "=") .append(searchParameters.getHighlight().getFragmentSize()); } if (searchParameters.getHighlight().getMaxAnalyzedChars() != null) { url.append("&").append(HighlightParams.MAX_CHARS + "=") .append(searchParameters.getHighlight().getMaxAnalyzedChars()); } if (searchParameters.getHighlight().getMergeContiguous() != null) { url.append("&").append(HighlightParams.MERGE_CONTIGUOUS_FRAGMENTS + "=") .append(searchParameters.getHighlight().getMergeContiguous()); } if (searchParameters.getHighlight().getUsePhraseHighlighter() != null) { url.append("&").append(HighlightParams.USE_PHRASE_HIGHLIGHTER + "=") .append(searchParameters.getHighlight().getUsePhraseHighlighter()); } if (searchParameters.getHighlight().getPrefix() != null) { url.append("&").append(HighlightParams.SIMPLE_PRE + "=") .append(encoder.encode(searchParameters.getHighlight().getPrefix(), "UTF-8")); } if (searchParameters.getHighlight().getPostfix() != null) { url.append("&").append(HighlightParams.SIMPLE_POST + "=") .append(encoder.encode(searchParameters.getHighlight().getPostfix(), "UTF-8")); } if (searchParameters.getHighlight().getFields() != null && !searchParameters.getHighlight().getFields().isEmpty()) { List<String> fieldNames = new ArrayList<>(searchParameters.getHighlight().getFields().size()); for (FieldHighlightParameters aField : searchParameters.getHighlight().getFields()) { ParameterCheck.mandatoryString("highlight field", aField.getField()); fieldNames.add(aField.getField()); if (aField.getSnippetCount() != null) { url.append("&f.").append(encoder.encode(aField.getField(), "UTF-8")) .append("." + HighlightParams.SNIPPETS + "=").append(aField.getSnippetCount()); } if (aField.getFragmentSize() != null) { url.append("&f.").append(encoder.encode(aField.getField(), "UTF-8")) .append("." + HighlightParams.FRAGSIZE + "=").append(aField.getFragmentSize()); } if (aField.getFragmentSize() != null) { url.append("&f.").append(encoder.encode(aField.getField(), "UTF-8")) .append("." + HighlightParams.FRAGSIZE + "=").append(aField.getFragmentSize()); } if (aField.getMergeContiguous() != null) { url.append("&f.").append(encoder.encode(aField.getField(), "UTF-8")) .append("." + HighlightParams.MERGE_CONTIGUOUS_FRAGMENTS + "=") .append(aField.getMergeContiguous()); } if (aField.getPrefix() != null) { url.append("&f.").append(encoder.encode(aField.getField(), "UTF-8")) .append("." + HighlightParams.SIMPLE_PRE + "=") .append(encoder.encode(aField.getPrefix(), "UTF-8")); } if (aField.getPostfix() != null) { url.append("&f.").append(encoder.encode(aField.getField(), "UTF-8")) .append("." + HighlightParams.SIMPLE_POST + "=") .append(encoder.encode(aField.getPostfix(), "UTF-8")); } } url.append("&").append(HighlightParams.FIELDS + "=") .append(encoder.encode(String.join(",", fieldNames), "UTF-8")); } } }
From source file:org.alfresco.solr.highlight.AlfrescoHighlighterTest.java
License:Open Source License
@Test public void highlightingMaxAnalyzedCharsTest() { logger.info("######### maxAnalyzedChars ###########"); SolrServletRequest req = areq(params("q", "name:long", "qt", "/afts", "start", "0", "rows", "5", HighlightParams.HIGHLIGHT, "true", HighlightParams.Q, "long", HighlightParams.FIELDS, "name,title", HighlightParams.MAX_CHARS, "18", HighlightParams.SIMPLE_PRE, "{", HighlightParams.SIMPLE_POST, "}"), "{\"locales\":[\"en\"], \"tenants\": [ \"\" ]}"); assertQ(req, "*[count(//lst[@name='highlighting']/lst)=2]", "*[count(//lst[@name='highlighting']/lst/arr[@name='name'])=2]", "//lst[@name='highlighting']/lst[1]/arr[@name='name']/str[.='some very {long} name']", "//lst[@name='highlighting']/lst[2]/arr[@name='name']/str[.='this is some {long}']"); }