Parse the Query!
There are many interesting articles, so this one will concentrate only on parts of the Lucene project. In particular, we will concentrate on the indexing of documents, which is the heart of Lucene. Each document has to be indexed in advance to be searched. Let's walk through this process very quickly. Lucene analyzes input and creates Document objects. This is a composition of many Field objects, each composed of name-value pairs. You may think about these as "properties" associated with the document. When you want to find a document, all you need is a set of name-value pairs to be used as search criteria. Lucene will find all documents that meet this criteria.
Let's look at an example. Say we have an address book application. Each entry is represented with the
Friend class, as shown in Figure 3.
Figure 3. Friend class
|name:John||Find all entries where attribute "name" is equal "John".|
|name:J*||Find all entries where attribute "name" starts with "J".|
|name: John AND phoneNumber: 1234||Find all entries where attribute "name" is equal to "John" and attribute "phoneNumber" is equal to "1234".|
|name:J* NOT name: John||Find all entries where attribute "name" starts with "J" but is not equal to "John".|
We assume all entries in the address book application are stored in a database accessed with Hibernate. This is a typical example, used in plenty of real-world applications. All we need is some code between the search form and the Hibernate API that can understand the query language and produce Hibernate criteria. Figure 4 shows what we want to achieve.
Figure 4. Solution overview
For each query string entered by the user, we invoke
QueryParser to build an object representation. Next
QueryInterpreter walks through the object tree and uses
HibernateQueryBuilder to create the Hibernate criteria. Hibernate will then execute the query and return the result. Simple, isn't it? We are only missing the amber parts shown on the diagram.