Hi,

I am using Apache Lucene 8.5.0 version



I have written a simple program to create index of words with special
character.



Example I have indexed the word *temp/hello*



Now I want to search the word with wildcard query *te*/hello*



I get the error* : *Exception in thread "main"
*org.apache.lucene.queryparser.classic.ParseException*: Cannot parse
'te*/hello': Lexical error at line 1, column 10.  Encountered: <EOF> after
: "/hello"



When I escape the query with QueryParser.escape method it doesn’t yield any
results when special characters are part of query



*Can someone suggest the right way for indexing and searching words with
special characters?*



Here’s my simple program



*import* java.io.BufferedReader;

*import* java.io.IOException;

*import* java.io.InputStreamReader;

*import* java.nio.file.Paths;



*import* org.apache.lucene.analysis.Analyzer;

*import* org.apache.lucene.analysis.custom.CustomAnalyzer;

*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.IndexWriterConfig.OpenMode;

*import* org.apache.lucene.queryparser.classic.ParseException;

*import* org.apache.lucene.queryparser.classic.QueryParser;

*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.MMapDirectory;



*public* *class* HelloLucene {

    *private* *static* Analyzer buildAnalyzer() *throws* IOException {

        *return* CustomAnalyzer.*builder*()

                .withTokenizer("keyWord")

                .addTokenFilter("lowercase")

                .build();



    }





    *public* *static* *void* main(String[] args) *throws* IOException,
ParseException {

        Analyzer analyzer = *buildAnalyzer*();

        // 1. create the index

        Directory index = *new* MMapDirectory(Paths.*get*("c:\\temp\\index"
));



        IndexWriterConfig config = *new* IndexWriterConfig(analyzer);



        String indexType = "create";

        *if* ("create".equals(indexType)) {

            config.setOpenMode(OpenMode.*CREATE*);

        } *else* {

            config.setOpenMode(OpenMode.*CREATE_OR_APPEND*);

        }

        IndexWriter w = *new* IndexWriter(index, config);





        *long* start = System.*currentTimeMillis*();

        *addDoc*(w, "Temp/Hello", "Artifact");



        *long* end = System.*currentTimeMillis*();

        w.close();



        *for* (*int* i = 0; i < 100; i++) {



            // 2. query

            BufferedReader input = *new* BufferedReader(*new*
InputStreamReader(System.*in*));

            String query = input.readLine();



            //Prefix Search



            QueryParser queryParser = *new* QueryParser("Name",analyzer);

            queryParser.setAllowLeadingWildcard(*true*);

            Query q = queryParser.parse(QueryParser.*escape*(query));





            // 3. search



            *int* hitsPerPage = 10;

            IndexReader reader = DirectoryReader.*open*(index);

            IndexSearcher searcher = *new* IndexSearcher(reader);

            TopDocs docs = searcher.search(q, hitsPerPage);

            ScoreDoc[] hits = docs.scoreDocs;



            // 4. display results

            *System.**out*.println("Found " + hits.length + " hits.");

            *for* (*int* j = 0; j < hits.length; ++j) {

                *int* docId = hits[j].doc;

                Document d = searcher.doc(docId);

                *System.**out*.println((j + 1) + ". " + d.get("Name") + "\t"
+ d.get("Type"));

            }



            reader.close();

        }



    }



    *private* *static* *void* addDoc(IndexWriter w, String name, String type)
*throws* IOException {

        Document doc = *new* Document();

        doc.add(*new* TextField("Name", name, Field.Store.*YES*));



        // use a string field for *isbn* because we don't want it
*tokenized*

        doc.add(*new* TextField("Type", type, Field.Store.*YES*));

        w.addDocument(doc);

    }

}

Reply via email to