136
|
Chapter 3, Tables and Trees
#26 Search Through JTables Easily
HACK
First, add a field with the row index in the inner table model. You’ll use this
to link back to that row later in the row-to-model index. Each field needs a
name and a value, so create a constant called
ROW_NUMBER
that you’ll refer to
later when retrieving the links:
Document document = new Document( );
document.add(new Field(ROW_NUMBER, "" + row, true, true, true));
//more indexing to come
writer.addDocument(document);
Then, iterate through all of the columns and add a Field for each column
name/value pair:
for (int column=0; column < tableModel.getColumnCount( ); column++){
String columnName = tableModel.getColumnName(column);
String columnValue = String.valueOf(
tableModel.getValueAt(row, column)
).toLowerCase( );
document.add(new Field(columnName, columnValue, true, true, true));
}
Searching
There are two parts to the searching. First, you have to hit the Lucene index
with a search string. This will give you a list of rows in the inner table model
that match the search. Then you need to reset the row-to-model index,
pointing to those rows.
Getting results from the index. To actually get the search results, you need an
IndexSearcher that speaks to the index and returns your search results:
IndexSearcher is = new IndexSearcher(directory);
You want to make sure all of the fields get searched, so iterate through the
table model and put all of the column names in an array that you’ll pass into
the Lucene search call:
String[] fields = new String[tableModel.getColumnCount( )];
for (int t=0; t<tableModel.getColumnCount( ); t++){
fields[t]=tableModel.getColumnName(t);
}
Next, create a Query object to pass to the IndexSearcher; there is a helper
method on
MultiFieldQueryParser to do just that. Pass it the fields you want
to search, your search
String, and the analyzer:
Query query = MultiFieldQueryParser.parse(searchString, fields, analyzer);
Then run the search. Hits is the object type returned by the search call.
You’ll process the hits in the next section when you map the results back to
the inner table model:
Hits hits = is.search(query);

Get Swing Hacks now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.