Changeset 12656


Ignore:
Timestamp:
2006-09-04T10:57:05+12:00 (18 years ago)
Author:
mdewsnip
Message:

Put old range filter stuff back, and added "-startresults" and "-endresults" support to return just the desired results, thus speeding up the query result parsing. Many thanks to John Thompson and DL Consulting Ltd.

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/gsdl/bin/script/lucene_query.pl

    r12408 r12656  
    4848    my $sort_field = shift(@_);
    4949    my $dco = shift(@_);
     50    my $start_results = shift(@_);
     51    my $end_results = shift(@_);
    5052    my $out_file = shift(@_);
    5153
     
    6567    if (defined($dco)) {
    6668        $cmd .= " -dco " . $dco;
     69    }
     70    if (defined($start_results)) {
     71        $cmd .= " -startresults " . $start_results;
     72    }
     73    if (defined($end_results)) {
     74        $cmd .= " -endresults " . $end_results;
    6775    }
    6876    if (defined($out_file)) {
     
    8694    my $argc = scalar(@argv);
    8795    if ($argc == 0) {
    88     print STDERR "Usage: $PROGNAME full-index-dir [query] [-fuzzy] [-filter filter_string] [-sort sort_field] [-dco AND|OR] [-out out_file]\n";
     96    print STDERR "Usage: $PROGNAME full-index-dir [query] [-fuzzy] [-filter filter_string] [-sort sort_field] [-dco AND|OR] [-startresults number -endresults number] [-out out_file]\n";
    8997    exit 1;
    9098    }
     
    96104    my $sort_field = undef;
    97105    my $dco = undef;
     106    my $start_results = undef;
     107    my $end_results = undef;
    98108    my $out_file = undef;
    99109    for (my $i = 0; $i < scalar(@argv); $i++)
     
    114124            $dco = $argv[$i];
    115125    }
     126        elsif ($argv[$i] eq "-startresults") {
     127            $i++;
     128            $start_results = $argv[$i];
     129    }
     130        elsif ($argv[$i] eq "-endresults") {
     131            $i++;
     132            $end_results = $argv[$i];
     133    }
    116134        elsif ($argv[$i] eq "-out") {
    117135            $i++;
     
    123141    }
    124142
    125     open_java_lucene($full_indexdir, $fuzzy, $filter_string, $sort_field, $dco, $out_file);
     143    open_java_lucene($full_indexdir, $fuzzy, $filter_string, $sort_field, $dco, $start_results, $end_results, $out_file);
    126144
    127145    if (defined $query) {
  • trunk/gsdl/src/java/org/nzdl/gsdl/LuceneWrap/GS2LuceneQuery.java

    r12653 r12656  
    33 * @author  [email protected]
    44 * @author  [email protected]
     5 * @author  [email protected]
     6 * @author  [email protected]
    57 * @version
    68 */
     
    1113import java.io.*;
    1214import java.util.*;
     15import java.util.regex.*;
    1316
    1417import org.apache.lucene.analysis.Analyzer;
     
    4144    {
    4245    if (args.length == 0) {
    43         System.out.println("Usage: GS2LuceneQuery <index directory> [-fuzzy] [-filter filter_string] [-sort sort_field] [-dco AND|OR]");
     46        System.out.println("Usage: GS2LuceneQuery <index directory> [-fuzzy] [-filter filter_string] [-sort sort_field] [-dco AND|OR] [-startresults number -endresults number]");
    4447        return;
    4548    }
     
    4952        IndexReader reader = ((IndexSearcher) searcher).getIndexReader();
    5053
    51         // Create one query parser with stop words, and one with none
     54        // Create one query parser with the standard set of stop words, and one with none
    5255        QueryParser query_parser = new QueryParser("TX", new StandardAnalyzer(stop_words));
    5356        QueryParser query_parser_no_stop_words = new QueryParser("TX", new StandardAnalyzer(new String[] { }));
    5457
    5558        Sort sorter = new Sort();
    56         QueryFilter filter = null;
     59        Filter filter = null;
    5760            boolean fuzzy = false;
     61
     62        // Paging
     63        int start_results = 1;
     64        int end_results = -1;
    5865
    5966            // New code to allow the default conjunction operator to be
     
    7077                        {
    7178                            i++;
    72                 try {
    73                 filter = new QueryFilter(query_parser.parse(args[i]));
    74                 }
    75                 catch (ParseException exception) {
    76                 exception.printStackTrace();
    77                 }
     79
     80                // Parse up filter
     81                filter = parseFilterString(args[i]);
    7882                        }
    7983                    if (args[i].equals("-dco"))
     
    8690                            fuzzy = true;
    8791                        }
     92            if (args[i].equals("-startresults"))
     93            {
     94                i++;
     95                if (args[i].matches("\\d+"))
     96                {
     97                    start_results = Integer.parseInt(args[i]);
     98                }
     99            }
     100            if (args[i].equals("-endresults"))
     101            {
     102                i++;
     103                if (args[i].matches("\\d+"))
     104                {
     105                    end_results = Integer.parseInt(args[i]);
     106                }
     107            }
    88108                }
    89109
     
    104124        System.out.println("<ResultSet>");
    105125        System.out.println("  <QueryString>" + query_string + "</QueryString>");
     126        if (filter != null)
     127            {
     128            System.out.println("  <FilterString>" + filter.toString() + "</FilterString>");
     129            }
    106130
    107131        try {
     
    139163            // Do we need to use a hit iterator to get sorted results?
    140164            System.out.println("  <MatchingDocsInfo num=\"" + hits.length() + "\"/>");
     165            System.out.println("  <StartResults num=\"" + start_results + "\" />");
     166            System.out.println("  <EndsResults num=\"" + end_results + "\" />");
     167
     168            int counter = 1;
    141169            Iterator hit_iter = hits.iterator();
    142170            while (hit_iter.hasNext())
     
    145173                Document doc = hit.getDocument();
    146174                String node_id = doc.get("nodeID");
    147                 System.out.println("  <Match id=\"" + node_id + "\" />");
    148                        
     175
     176                // May not be paging results
     177                if (start_results == 1 && end_results == -1)
     178                {
     179                    System.out.println("  <Match id=\"" + node_id + "\" />");
     180                }
     181                // Otherwise skip up until page offset
     182                else if (start_results <= counter && counter <= end_results)
     183                {
     184                    System.out.println("  <Match id=\"" + node_id + "\" />");
     185                }
     186                // And skip all the rest
     187
    149188                // From the document, extract the Term Vector for the
    150189                // TX field
     
    182221                    ///ystem.err.println("Error! Missing term vector for document " + hit.getId());
    183222                }
     223                ++counter;
    184224            }
    185225
     
    347387    return query;
    348388    }
     389
     390
     391  /**
     392   *  @todo Michael to comment
     393   */
     394  private static Filter parseFilterString(String filter_string)
     395  {
     396    Filter result = null;
     397    Pattern pattern = Pattern.compile("\\s*\\+(\\w+)\\:([\\{\\[])(\\d+)\\s+TO\\s+(\\d+)([\\}\\]])\\s*");
     398    Matcher matcher = pattern.matcher(filter_string);
     399    if (matcher.matches())
     400      {
     401        String field_name = matcher.group(1);
     402        boolean include_lower = matcher.group(2).equals("[");
     403        String lower_term = matcher.group(3);
     404        String upper_term = matcher.group(4);
     405        boolean include_upper = matcher.group(5).equals("]");
     406        result = new RangeFilter(field_name, lower_term, upper_term, include_lower, include_upper);
     407      }
     408    else
     409      {
     410        System.err.println("Error: Could not understand filter string \"" + filter_string + "\"");
     411      }
     412    return result;
     413  }
     414  /** parseFilterString() **/
    349415}
  • trunk/indexers/lucene-gs/src/org/greenstone/LuceneWrapper/GS2LuceneQuery.java

    r12653 r12656  
    33 * @author  [email protected]
    44 * @author  [email protected]
     5 * @author  [email protected]
     6 * @author  [email protected]
    57 * @version
    68 */
     
    1113import java.io.*;
    1214import java.util.*;
     15import java.util.regex.*;
    1316
    1417import org.apache.lucene.analysis.Analyzer;
     
    4144    {
    4245    if (args.length == 0) {
    43         System.out.println("Usage: GS2LuceneQuery <index directory> [-fuzzy] [-filter filter_string] [-sort sort_field] [-dco AND|OR]");
     46        System.out.println("Usage: GS2LuceneQuery <index directory> [-fuzzy] [-filter filter_string] [-sort sort_field] [-dco AND|OR] [-startresults number -endresults number]");
    4447        return;
    4548    }
     
    4952        IndexReader reader = ((IndexSearcher) searcher).getIndexReader();
    5053
    51         // Create one query parser with stop words, and one with none
     54        // Create one query parser with the standard set of stop words, and one with none
    5255        QueryParser query_parser = new QueryParser("TX", new StandardAnalyzer(stop_words));
    5356        QueryParser query_parser_no_stop_words = new QueryParser("TX", new StandardAnalyzer(new String[] { }));
    5457
    5558        Sort sorter = new Sort();
    56         QueryFilter filter = null;
     59        Filter filter = null;
    5760            boolean fuzzy = false;
     61
     62        // Paging
     63        int start_results = 1;
     64        int end_results = -1;
    5865
    5966            // New code to allow the default conjunction operator to be
     
    7077                        {
    7178                            i++;
    72                 try {
    73                 filter = new QueryFilter(query_parser.parse(args[i]));
    74                 }
    75                 catch (ParseException exception) {
    76                 exception.printStackTrace();
    77                 }
     79
     80                // Parse up filter
     81                filter = parseFilterString(args[i]);
    7882                        }
    7983                    if (args[i].equals("-dco"))
     
    8690                            fuzzy = true;
    8791                        }
     92            if (args[i].equals("-startresults"))
     93            {
     94                i++;
     95                if (args[i].matches("\\d+"))
     96                {
     97                    start_results = Integer.parseInt(args[i]);
     98                }
     99            }
     100            if (args[i].equals("-endresults"))
     101            {
     102                i++;
     103                if (args[i].matches("\\d+"))
     104                {
     105                    end_results = Integer.parseInt(args[i]);
     106                }
     107            }
    88108                }
    89109
     
    104124        System.out.println("<ResultSet>");
    105125        System.out.println("  <QueryString>" + query_string + "</QueryString>");
     126        if (filter != null)
     127            {
     128            System.out.println("  <FilterString>" + filter.toString() + "</FilterString>");
     129            }
    106130
    107131        try {
     
    139163            // Do we need to use a hit iterator to get sorted results?
    140164            System.out.println("  <MatchingDocsInfo num=\"" + hits.length() + "\"/>");
     165            System.out.println("  <StartResults num=\"" + start_results + "\" />");
     166            System.out.println("  <EndsResults num=\"" + end_results + "\" />");
     167
     168            int counter = 1;
    141169            Iterator hit_iter = hits.iterator();
    142170            while (hit_iter.hasNext())
     
    145173                Document doc = hit.getDocument();
    146174                String node_id = doc.get("nodeID");
    147                 System.out.println("  <Match id=\"" + node_id + "\" />");
    148                        
     175
     176                // May not be paging results
     177                if (start_results == 1 && end_results == -1)
     178                {
     179                    System.out.println("  <Match id=\"" + node_id + "\" />");
     180                }
     181                // Otherwise skip up until page offset
     182                else if (start_results <= counter && counter <= end_results)
     183                {
     184                    System.out.println("  <Match id=\"" + node_id + "\" />");
     185                }
     186                // And skip all the rest
     187
    149188                // From the document, extract the Term Vector for the
    150189                // TX field
     
    182221                    ///ystem.err.println("Error! Missing term vector for document " + hit.getId());
    183222                }
     223                ++counter;
    184224            }
    185225
     
    347387    return query;
    348388    }
     389
     390
     391  /**
     392   *  @todo Michael to comment
     393   */
     394  private static Filter parseFilterString(String filter_string)
     395  {
     396    Filter result = null;
     397    Pattern pattern = Pattern.compile("\\s*\\+(\\w+)\\:([\\{\\[])(\\d+)\\s+TO\\s+(\\d+)([\\}\\]])\\s*");
     398    Matcher matcher = pattern.matcher(filter_string);
     399    if (matcher.matches())
     400      {
     401        String field_name = matcher.group(1);
     402        boolean include_lower = matcher.group(2).equals("[");
     403        String lower_term = matcher.group(3);
     404        String upper_term = matcher.group(4);
     405        boolean include_upper = matcher.group(5).equals("]");
     406        result = new RangeFilter(field_name, lower_term, upper_term, include_lower, include_upper);
     407      }
     408    else
     409      {
     410        System.err.println("Error: Could not understand filter string \"" + filter_string + "\"");
     411      }
     412    return result;
     413  }
     414  /** parseFilterString() **/
    349415}
Note: See TracChangeset for help on using the changeset viewer.