Index: contrib/CHANGES.txt =================================================================== --- contrib/CHANGES.txt (revision 985918) +++ contrib/CHANGES.txt (working copy) @@ -112,6 +112,10 @@ such as stopword lists and any language-specific processing in addition to stemming. Add Turkish and Romanian stopwords lists to support this. (Robert Muir, Uwe Schindler, Simon Willnauer) + + * LUCENE-2603: Add setMultiValuedSeparator(char) method to set an arbitrary + char that is used when concatenating multiValued data. Default is a space + (' '). It is applied on ANALYZED field only. (Koji Sekiguchi) New features Index: contrib/highlighter/src/test/org/apache/lucene/search/vectorhighlight/SimpleFragmentsBuilderTest.java =================================================================== --- contrib/highlighter/src/test/org/apache/lucene/search/vectorhighlight/SimpleFragmentsBuilderTest.java (revision 985918) +++ contrib/highlighter/src/test/org/apache/lucene/search/vectorhighlight/SimpleFragmentsBuilderTest.java (working copy) @@ -148,6 +148,21 @@ SimpleFragListBuilder sflb = new SimpleFragListBuilder(); FieldFragList ffl = sflb.createFieldFragList( fpl, 100 ); SimpleFragmentsBuilder sfb = new SimpleFragmentsBuilder(); + // '/' separator doesn't effect the snippet because of NOT_ANALYZED field + sfb.setMultiValuedSeparator( '/' ); assertEquals( "abcdefghijkl", sfb.createFragment( reader, 0, F, ffl ) ); } + + public void testMVSeparator() throws Exception { + makeIndexShortMV(); + + FieldQuery fq = new FieldQuery( tq( "d" ), true, true ); + FieldTermStack stack = new FieldTermStack( reader, 0, F, fq ); + FieldPhraseList fpl = new FieldPhraseList( stack, fq ); + SimpleFragListBuilder sflb = new SimpleFragListBuilder(); + FieldFragList ffl = sflb.createFieldFragList( fpl, 100 ); + SimpleFragmentsBuilder sfb = new SimpleFragmentsBuilder(); + sfb.setMultiValuedSeparator( '/' ); + assertEquals( "a b c/d e", sfb.createFragment( reader, 0, F, ffl ) ); + } } Index: contrib/highlighter/src/java/org/apache/lucene/search/vectorhighlight/BaseFragmentsBuilder.java =================================================================== --- contrib/highlighter/src/java/org/apache/lucene/search/vectorhighlight/BaseFragmentsBuilder.java (revision 985918) +++ contrib/highlighter/src/java/org/apache/lucene/search/vectorhighlight/BaseFragmentsBuilder.java (working copy) @@ -44,6 +44,7 @@ "", "" }; public static final String[] COLORED_POST_TAGS = { "" }; + private char multiValuedSeparator = ' '; protected BaseFragmentsBuilder(){ this( new String[]{ "" }, new String[]{ "" } ); @@ -155,7 +156,7 @@ int startOffset, int endOffset ){ while( buffer.length() < endOffset && index[0] < values.length ){ if( index[0] > 0 && values[index[0]].length() > 0 ) - buffer.append( ' ' ); + buffer.append( multiValuedSeparator ); buffer.append( values[index[0]++] ); } int eo = buffer.length() < endOffset ? buffer.length() : endOffset; @@ -166,12 +167,20 @@ int startOffset, int endOffset ){ while( buffer.length() < endOffset && index[0] < values.length ){ if( index[0] > 0 && values[index[0]].isTokenized() && values[index[0]].stringValue().length() > 0 ) - buffer.append( ' ' ); + buffer.append( multiValuedSeparator ); buffer.append( values[index[0]++].stringValue() ); } int eo = buffer.length() < endOffset ? buffer.length() : endOffset; return buffer.substring( startOffset, eo ); } + + public void setMultiValuedSeparator( char separator ){ + multiValuedSeparator = separator; + } + + public char getMultiValuedSeparator(){ + return multiValuedSeparator; + } protected String getPreTag( int num ){ return getPreTag( preTags, num );