jdbcTemplate.execute("CREATE DATABASE IF NOT EXISTS usersdb;");
jdbcTemplate.execute("USE usersdb;");
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS users"+
"(id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,"+
"email TINYTEXT NOT NULL,"+
....................
"UNIQUE KEY(email));");
CREATE DATABASE [IF NOT EXISTS] database_name
[CHARACTER SET charset_name]
[COLLATE collation_name]
Query query = new QueryParser(searchField, new StandardAnalyzer()).parse(querystr);
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Scanner;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
public class Main {
static final String path = "C:\\Users\\TMP\\";
static final String title = "Hello World!";
static final String body = "Пример двуязычной записи и поиск...";
static Directory dir;
public static void main(String[] args) throws IOException, ParseException {
StandardAnalyzer analyzer = new StandardAnalyzer();
dir = FSDirectory.open(Paths.get(path));
IndexWriterConfig config = new IndexWriterConfig(analyzer);
// Create a new index in the directory, removing any
config.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
IndexWriter w = new IndexWriter(dir, config);
addDoc(w, title, body);
addDoc(w, "Lucene in Action", "193398817");
addDoc(w, "Managing Gigabytes", "55063554A");
addDoc(w, "The Art of Computer Science", "9900333X");
w.close();
String encoding = System.getProperty("console.encoding", "utf-8");
Scanner sc = new Scanner(System.in, encoding);
while (true) {
System.out.print("ведите запрос:\t");
String querystr = sc.nextLine();
fuzzySearch(querystr, "title", 2);
}
}
private static void addDoc(IndexWriter w, String title, String body) throws IOException {
Document doc = new Document();
doc.add(new TextField("title", title, Field.Store.YES));
doc.add(new TextField("body", body, Field.Store.YES));
w.addDocument(doc);
}
public static void fuzzySearch(final String querystr, final String searchField,
final int limit) throws IOException, ParseException {
IndexReader reader = DirectoryReader.open(dir);
IndexSearcher indexSearcher = new IndexSearcher(reader);
Term term = new Term(searchField, querystr);
int maxEdits = 2; // minimum symbols in query
Query query = new FuzzyQuery(term, maxEdits);
TopDocs search = indexSearcher.search(query, limit);
ScoreDoc[] hits = search.scoreDocs;
showHits(hits);
}
private static void showHits(ScoreDoc[] hits) throws IOException {
IndexReader reader = DirectoryReader.open(dir);
if (hits.length == 0) {
System.out.println("\n\tНичего не найдено");
return;
}
System.out.println("\n\tРезультаты поиска:");
for (ScoreDoc hit : hits) {
final String title = reader.document(hit.doc).get("title");
final String body = reader.document(hit.doc).get("body");
System.out.println("\n\tDocument Id = " + hit.doc + "\n\ttitle = " + title + "\n\tbody = " + body);
}
}
}
нет прондексированных документов в reader.
скл-подобной бд - в сотни раз быстрее
indexOf()
основную часть времени забирает чтение файла. Если читать файл не построчно, а как массив байтов, например через readAllBytes()
то поиск происходит в оперативной памяти (в стриме). То есть скорость зависит фактически от железа, ну и разумеется от алгоритмов выборки. если запись в этот файл подконтрольна- Да. Запись подконтрольна.
можно предложить другое решение для индексации текста
class DAO
без модификатора доступа. Теперь он доступен только в одном packege.