You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by to...@apache.org on 2017/08/28 10:09:30 UTC

svn commit: r1806421 - in /jackrabbit/oak/trunk: ./ oak-search-mt/ oak-search-mt/src/ oak-search-mt/src/main/ oak-search-mt/src/main/java/ oak-search-mt/src/main/java/org/ oak-search-mt/src/main/java/org/apache/ oak-search-mt/src/main/java/org/apache/j...

Author: tommaso
Date: Mon Aug 28 10:09:30 2017
New Revision: 1806421

URL: http://svn.apache.org/viewvc?rev=1806421&view=rev
Log:
OAK-4348 - added oak-search-mt with lucene mt extension based on apache joshua

Added:
    jackrabbit/oak/trunk/oak-search-mt/   (with props)
    jackrabbit/oak/trunk/oak-search-mt/pom.xml   (with props)
    jackrabbit/oak/trunk/oak-search-mt/src/
    jackrabbit/oak/trunk/oak-search-mt/src/main/
    jackrabbit/oak/trunk/oak-search-mt/src/main/java/
    jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/
    jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/
    jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/jackrabbit/
    jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/jackrabbit/oak/
    jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/jackrabbit/oak/plugins/
    jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/jackrabbit/oak/plugins/index/
    jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/jackrabbit/oak/plugins/index/mt/
    jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProvider.java   (with props)
    jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProviderFactory.java   (with props)
    jackrabbit/oak/trunk/oak-search-mt/src/test/
    jackrabbit/oak/trunk/oak-search-mt/src/test/java/
    jackrabbit/oak/trunk/oak-search-mt/src/test/java/org/
    jackrabbit/oak/trunk/oak-search-mt/src/test/java/org/apache/
    jackrabbit/oak/trunk/oak-search-mt/src/test/java/org/apache/jackrabbit/
    jackrabbit/oak/trunk/oak-search-mt/src/test/java/org/apache/jackrabbit/oak/
    jackrabbit/oak/trunk/oak-search-mt/src/test/java/org/apache/jackrabbit/oak/plugins/
    jackrabbit/oak/trunk/oak-search-mt/src/test/java/org/apache/jackrabbit/oak/plugins/index/
    jackrabbit/oak/trunk/oak-search-mt/src/test/java/org/apache/jackrabbit/oak/plugins/index/mt/
    jackrabbit/oak/trunk/oak-search-mt/src/test/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProviderTest.java   (with props)
Modified:
    jackrabbit/oak/trunk/pom.xml

Propchange: jackrabbit/oak/trunk/oak-search-mt/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Mon Aug 28 10:09:30 2017
@@ -0,0 +1,2 @@
+target
+*.iml

Added: jackrabbit/oak/trunk/oak-search-mt/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-mt/pom.xml?rev=1806421&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-search-mt/pom.xml (added)
+++ jackrabbit/oak/trunk/oak-search-mt/pom.xml Mon Aug 28 10:09:30 2017
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd ">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.jackrabbit</groupId>
+    <artifactId>oak-parent</artifactId>
+    <version>1.8-SNAPSHOT</version>
+    <relativePath>../oak-parent/pom.xml</relativePath>
+  </parent>
+
+  <artifactId>oak-search-mt</artifactId>
+  <name>Oak Search Machine Translation</name>
+  <packaging>bundle</packaging>
+  <description>Machine Translation extension for Oak search</description>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <configuration>
+          <instructions>
+            <Export-Package>
+              !*
+            </Export-Package>
+          </instructions>
+        </configuration>
+        <executions>
+          <execution>
+            <id>baseline</id>
+            <goals>
+              <goal>baseline</goal>
+            </goals>
+            <phase>pre-integration-test</phase>
+            <configuration>
+              <!--
+                This is required because there's no prior (stable) version of oak-search-mt.
+                This should be removed post 1.8 release
+                Anyway nothing is exported therefore it shouldn't be a problem
+              -->
+              <skip>true</skip>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.rat</groupId>
+        <artifactId>apache-rat-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <!-- Optional OSGi dependencies, used only when running within OSGi -->
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.core</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.compendium</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.annotation</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.felix</groupId>
+      <artifactId>org.apache.felix.scr.annotations</artifactId>
+      <scope>provided</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>oak-lucene</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.joshua</groupId>
+      <artifactId>joshua-incubating</artifactId>
+      <version>6.1</version>
+    </dependency>
+
+    <!-- Logging -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+
+    <!-- Findbugs annotations -->
+    <dependency>
+      <groupId>com.google.code.findbugs</groupId>
+      <artifactId>jsr305</artifactId>
+    </dependency>
+
+    <!-- Test Dependencies -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <version>1.10.19</version>
+      <scope>test</scope>
+    </dependency>
+
+  </dependencies>
+</project>

Propchange: jackrabbit/oak/trunk/oak-search-mt/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProvider.java?rev=1806421&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProvider.java (added)
+++ jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProvider.java Mon Aug 28 10:09:30 2017
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.index.mt;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.jackrabbit.oak.plugins.index.lucene.FieldNames;
+import org.apache.jackrabbit.oak.plugins.index.lucene.spi.FulltextQueryTermsProvider;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.joshua.decoder.Decoder;
+import org.apache.joshua.decoder.StructuredTranslation;
+import org.apache.joshua.decoder.Translation;
+import org.apache.joshua.decoder.segment_file.Sentence;
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.TokenStream;
+import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.TermQuery;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link FulltextQueryTermsProvider} that performs machine translation on full text returning a query containing
+ * translated tokens.
+ */
+public class MTFulltextQueryTermsProvider implements FulltextQueryTermsProvider {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private final Decoder decoder;
+    private final Set<String> nodeTypes;
+    private final float minScore;
+
+    public MTFulltextQueryTermsProvider(Decoder decoder, Set<String> nodeTypes, float minScore) {
+        this.decoder = decoder;
+        this.nodeTypes = nodeTypes;
+        this.minScore = minScore;
+    }
+
+    @Override
+    public Query getQueryTerm(String text, Analyzer analyzer, NodeState indexDefinition) {
+        BooleanQuery query = new BooleanQuery();
+        Sentence sentence = new Sentence(text, 0, decoder.getJoshuaConfiguration());
+        Translation translation = decoder.decode(sentence);
+        log.debug("{} decoded into {}", text, translation);
+        // try phrase translation first
+        List<StructuredTranslation> structuredTranslations = translation.getStructuredTranslations();
+        if (!structuredTranslations.isEmpty()) {
+            addTranslations(query, structuredTranslations);
+        } else {
+            // if phrase cannot be translated, perform token by token translation
+            try {
+                TokenStream tokenStream = analyzer.tokenStream(null, new StringReader(text));
+                tokenStream.addAttribute(CharTermAttribute.class);
+                tokenStream.reset();
+                while (tokenStream.incrementToken()) {
+                    CharTermAttribute attribute = tokenStream.getAttribute(CharTermAttribute.class);
+                    Translation translatedToken = decoder.decode(new Sentence(attribute.toString(), 0,
+                            decoder.getJoshuaConfiguration()));
+                    addTranslations(query, translatedToken.getStructuredTranslations());
+                }
+                tokenStream.end();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+
+        }
+        return query.clauses().size() > 0 ? query : null;
+    }
+
+    private void addTranslations(BooleanQuery query, List<StructuredTranslation> structuredTranslations) {
+        for (StructuredTranslation st : structuredTranslations) {
+            String translationString = st.getTranslationString();
+            if (st.getTranslationScore() > minScore) {
+                query.add(new BooleanClause(new TermQuery(new Term(FieldNames.FULLTEXT, translationString)),
+                        BooleanClause.Occur.SHOULD));
+                log.debug("added query for translated phrase {}", translationString);
+                List<String> translationTokens = st.getTranslationTokens();
+                int i = 0;
+                // if output is a phrase, look for tokens having a word alignment to the original sentence terms
+                for (List<Integer> wa : st.getTranslationWordAlignments()) {
+                    if (!wa.isEmpty()) {
+                        String translatedTerm = translationTokens.get(i);
+                        log.debug("added query for translated token {}", translatedTerm);
+                        query.add(new BooleanClause(new TermQuery(new Term(FieldNames.FULLTEXT, translatedTerm)),
+                                BooleanClause.Occur.SHOULD));
+                    }
+                    i++;
+                }
+            }
+        }
+    }
+
+    public void clearResources() {
+        decoder.cleanUp();
+    }
+
+    @Nonnull
+    @Override
+    public Set<String> getSupportedTypes() {
+        return nodeTypes;
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProviderFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProviderFactory.java?rev=1806421&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProviderFactory.java (added)
+++ jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProviderFactory.java Mon Aug 28 10:09:30 2017
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.index.mt;
+
+import javax.annotation.Nonnull;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.ConfigurationPolicy;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.jackrabbit.oak.commons.PropertiesUtil;
+import org.apache.jackrabbit.oak.plugins.index.lucene.spi.FulltextQueryTermsProvider;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.joshua.decoder.Decoder;
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.search.Query;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Factory for {@link MTFulltextQueryTermsProvider}
+ */
+@Component(
+        name = "org.apache.jackrabbit.oak.plugins.index.lucene.mt.MTFulltextQueryTermsProviderFactory",
+        label = "Apache Jackrabbit Oak Machine Translation Fulltext Query Terms Provider",
+        configurationFactory = true,
+        metatype = true,
+        policy = ConfigurationPolicy.REQUIRE
+)
+@Service(FulltextQueryTermsProvider.class)
+public class MTFulltextQueryTermsProviderFactory implements FulltextQueryTermsProvider {
+
+    private static final float DEFAULT_MIN_SCORE = 0.5f;
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    @Property(label = "Joshua Config Path", description = "The absolute filesystem path to Apache Joshua configuration file")
+    private static final String CONFIG_PATH = "path.to.config";
+
+    @Property(label = "Node types", description = "List of node types for which expanding the query via MT", cardinality = 10)
+    private static final String NODE_TYPES = "node.types";
+
+    @Property(label = "Minimum score", description = "Minimum allowed score for a translated phrase/term to be used for expansion",
+            floatValue = DEFAULT_MIN_SCORE)
+    private static final String MIN_SCORE = "min.score";
+
+    private MTFulltextQueryTermsProvider queryTermsProvider;
+
+    @Activate
+    public void activate(Map<String, ?> config) throws Exception {
+        String pathToJoshuaConfig = PropertiesUtil.toString(config.get(CONFIG_PATH), ".");
+        String[] nts = PropertiesUtil.toStringArray(config.get(NODE_TYPES), new String[]{"Oak:unstructured"});
+        float minScore = (float) PropertiesUtil.toDouble(config.get(MIN_SCORE), DEFAULT_MIN_SCORE);
+        log.info("activating MT FulltextQueryTermProvider from Joshua config at {} on {} nodetypes, minScore {}", pathToJoshuaConfig, nts, minScore);
+        try {
+            log.debug("parsing joshua config file");
+            Decoder decoder = Decoder.createDecoder(pathToJoshuaConfig);
+            decoder.getJoshuaConfiguration().use_structured_output = true;
+            decoder.getJoshuaConfiguration().sanityCheck();
+            log.debug("decoder initialized");
+            Set<String> nodeTypes = new HashSet<>();
+            nodeTypes.addAll(Arrays.asList(nts));
+            queryTermsProvider = new MTFulltextQueryTermsProvider(decoder, nodeTypes, minScore);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Deactivate
+    public void deactivate() throws Exception {
+        log.info("clearing resources");
+        queryTermsProvider.clearResources();
+    }
+
+    @Override
+    public Query getQueryTerm(String text, Analyzer analyzer, NodeState indexDefinition) {
+        return queryTermsProvider.getQueryTerm(text, analyzer, indexDefinition);
+    }
+
+    @Nonnull
+    @Override
+    public Set<String> getSupportedTypes() {
+        return queryTermsProvider.getSupportedTypes();
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-search-mt/src/main/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProviderFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-search-mt/src/test/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProviderTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-mt/src/test/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProviderTest.java?rev=1806421&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-search-mt/src/test/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProviderTest.java (added)
+++ jackrabbit/oak/trunk/oak-search-mt/src/test/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProviderTest.java Mon Aug 28 10:09:30 2017
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.index.mt;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.joshua.decoder.Decoder;
+import org.apache.joshua.decoder.JoshuaConfiguration;
+import org.apache.joshua.decoder.StructuredTranslation;
+import org.apache.joshua.decoder.Translation;
+import org.apache.joshua.decoder.segment_file.Sentence;
+import org.apache.lucene.analysis.Analyzer;
+import org.junit.Test;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+/**
+ * Tests for {@link MTFulltextQueryTermsProvider}
+ */
+public class MTFulltextQueryTermsProviderTest {
+
+    @Test
+    public void testGetQueryTermWithPhraseTranslation() throws Exception {
+        Decoder decoder = mock(Decoder.class);
+        Translation translation = mock(Translation.class);
+        List<StructuredTranslation> translations = new LinkedList<>();
+        StructuredTranslation structuredTranslation = mock(StructuredTranslation.class);
+        when(structuredTranslation.getTranslationString()).thenReturn("fou bur");
+        translations.add(structuredTranslation);
+        when(translation.getStructuredTranslations()).thenReturn(translations);
+        when(decoder.decode(any(Sentence.class))).thenReturn(translation);
+        JoshuaConfiguration configuration = mock(JoshuaConfiguration.class);
+        when(decoder.getJoshuaConfiguration()).thenReturn(configuration);
+        Set<String> nodeTypes = new HashSet<>();
+        MTFulltextQueryTermsProvider mtFulltextQueryTermsProvider = new MTFulltextQueryTermsProvider(decoder, nodeTypes, -1);
+        Analyzer analyzer = mock(Analyzer.class);
+        NodeState indexDefinition = mock(NodeState.class);
+        mtFulltextQueryTermsProvider.getQueryTerm("foo bar", analyzer, indexDefinition);
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/oak/trunk/oak-search-mt/src/test/java/org/apache/jackrabbit/oak/plugins/index/mt/MTFulltextQueryTermsProviderTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/oak/trunk/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/pom.xml?rev=1806421&r1=1806420&r2=1806421&view=diff
==============================================================================
--- jackrabbit/oak/trunk/pom.xml (original)
+++ jackrabbit/oak/trunk/pom.xml Mon Aug 28 10:09:30 2017
@@ -56,6 +56,7 @@
     <module>oak-lucene</module>
     <module>oak-solr-core</module>
     <module>oak-solr-osgi</module>
+    <module>oak-search-mt</module>
     <module>oak-auth-external</module>
     <module>oak-auth-ldap</module>
     <module>oak-run-commons</module>