Reputation: 5313
I am working on a integrating Lucene search and indexing in our Spring-MVC based application and currently I am using Wild-card query search, but it's not working in a case-insensitive manner. Any ideas?
When I type Ideas, I get the results, but not for ideas.
Code :
@Override
public synchronized void saveIndexes(String text, String tagFileName, String filePath, long groupId, boolean type, int objectId) {
try {
Directory directory = org.apache.lucene.store.FSDirectory.open(path);
IndexWriterConfig config = new IndexWriterConfig(new SimpleAnalyzer());
IndexWriter indexWriter = new IndexWriter(directory, config);
org.apache.lucene.document.Document doc = new org.apache.lucene.document.Document();
if (filePath != null) {
File file = new File(filePath); // current directory
doc.add(new TextField("path", file.getPath(), Field.Store.YES));
}
doc.add(new StringField("id", String.valueOf(objectId), Field.Store.YES));
// doc.add(new TextField("id",String.valueOf(objectId),Field.Store.YES));
if (text == null) {
if (filePath != null) {
FileInputStream is = new FileInputStream(filePath);
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder stringBuffer = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
stringBuffer.append(line).append("\n");
}
stringBuffer.append("\n").append(tagFileName);
if(groupNotes!=null){
stringBuffer.append(String.valueOf(groupNotes.getNoteNumber()));
}
reader.close();
doc.add(new TextField("contents", stringBuffer.toString(), Field.Store.YES));
}
}
}
// Search code
@Override
public List<Integer> searchLucene(String text, long groupId, boolean type) {
Directory directory = FSDirectory.open(path);
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
Query query = new WildcardQuery(new Term("contents","*"+text + "*"));
TopDocs topDocs = indexSearcher.search(query, 50);
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
org.apache.lucene.document.Document document = indexSearcher.doc(scoreDoc.doc);
objectIds.add(Integer.valueOf(document.get("id")));
System.out.println("Text is "+document.get("contents"));
}
indexSearcher.getIndexReader().close();
directory.close();
}
Thank you.
Upvotes: 0
Views: 2113
Reputation: 13083
I would try to store text in lowercase into the index. And when the user searches the text, make the search query text in lowercase, before searching it in the index.
https://stackoverflow.com/a/30926385/4587961
Upvotes: 3