Lucene6.0 BooleanQuery组合查询应用实例

组合关系代表的意思如下:

     1、MUST和MUST表示“与”的关系,即“并集”。

     2、MUST和MUST_NOT前者包含后者不包含。
     3、MUST_NOT和MUST_NOT没意义
     4、SHOULD与MUST表示MUST,SHOULD失去意义;
     5、SHOUlD与MUST_NOT相当于MUST与MUST_NOT。

     6、SHOULD与SHOULD表示“或”的概念。

先取出文件夹下的所有File,然后给这些File创建索引,最后利用BooleanQuery进行组合查询

1.pom.xml:


<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>hui</groupId>
	<artifactId>Lucene</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>Lucene</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>


		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-core</artifactId>
			<version>6.0.0</version>
		</dependency>

		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-analyzers-common</artifactId>
			<version>6.0.0</version>
		</dependency>

		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-queryparser</artifactId>
			<version>6.0.0</version>
		</dependency>

		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-highlighter</artifactId>
			<version>6.0.0</version>
		</dependency>

	</dependencies>
</project>

2.递归取出文件夹下的所有文件ListFiles.java:

package luceneTest;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class ListFiles {

	private static List<File> filesResult = new ArrayList<>();

	public static void main(String[] args) {

		List<File> files = listFiles("e:/eclipse/OOP");
		System.out.println(files.size());
		for (File f : files) {
			System.out.println(f.getName());
		}
	}

	public static List<File> listFiles(String srcPath) {

		File file = new File(srcPath);
		File[] files = file.listFiles();

		for (File f : files) {
			if (f.isDirectory()) {
				listFiles(f.getAbsolutePath());
			} else {
				filesResult.add(f);
			}
		}
		return filesResult;
	}
}

3.组合查询:BooleanTest.java:

package extend;

import java.io.IOException;
import java.nio.file.Paths;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;

public class BooleanTest {
	public static void main(String[] args) {

		String srcPath = "E:/eclipse/OOP";
		String destPath = "e:/test/index";
		// try {
		// FilesTest.createIndexTo(srcPath, destPath);
		// } catch (IOException e) {
		// e.printStackTrace();
		// }

		testBooleanQuery(destPath, "fileContent", "java", "string");
	}

	private static void testBooleanQuery(String indexPath, String filedName, String str1,
			String str2) {
		DirectoryReader reader = null;
		try {
			Directory dir = new SimpleFSDirectory(Paths.get(indexPath));
			reader = DirectoryReader.open(dir);
			IndexSearcher searcher = new IndexSearcher(reader);

			Term term = new Term(filedName, str1);
			TermQuery tQuery = new TermQuery(term);
			BooleanClause clause = new BooleanClause(tQuery, Occur.MUST);

			Term term2 = new Term(filedName, str2);
			TermQuery tQuery2 = new TermQuery(term2);
			BooleanClause clause2 = new BooleanClause(tQuery2, Occur.MUST_NOT);

			BooleanQuery bQuery = new BooleanQuery.Builder().add(clause).add(clause2)
					.build();

			TopDocs topDocs = searcher.search(bQuery, 100);
			System.out.println(topDocs.scoreDocs.length);
			for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
				Document hitDoc = searcher.doc(scoreDoc.doc);

				System.out.println(hitDoc.get("filePath"));
			}

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

你可能感兴趣的:(Lucene6.0 BooleanQuery组合查询应用实例)