On Jun 30, 2005, at 4:12 PM, Bohl, David wrote:

FYI, I made an update to this (I'm the author) to handle span queries. I uploaded the updated code to the same bugzilla link. The code doesn't treat span queries like phrases - it just highlights the terms individually (if someone can find a way to highlight it as a phrase, feel free to update it).

I'm not sure, at the moment, how this could integrate with the Highlighter, but I wrote some code for Lucene in Action that displays spans like this:

spanOr([f:quick, f:fox]):
   the <quick> brown fox jumps over the lazy dog (0.37158427)
   the quick brown <fox> jumps over the lazy dog (0.37158427)
   the <quick> red fox jumps over the sleepy cat (0.37158427)
   the quick red <fox> jumps over the sleepy cat (0.37158427)

spanFirst(spanNear([f:quick, f:fox], 1, true), 4):
   the <quick brown fox> jumps over the lazy dog (0.18579213)
   the <quick red fox> jumps over the sleepy cat (0.18579213)

f:the:
   <the> quick brown fox jumps over the lazy dog (0.18579213)
   the quick brown fox jumps over <the> lazy dog (0.18579213)
   <the> quick red fox jumps over the sleepy cat (0.18579213)
   the quick red fox jumps over <the> sleepy cat (0.18579213)

spanNear([f:quick, f:brown], 0, false):
   the <quick brown> fox jumps over the lazy dog (0.2876891)


The relevant code is pasted below (and found in SpanQueryTest.java in the Lucene in Action code):

  private void dumpSpans(SpanQuery query) throws IOException {
    Spans spans = query.getSpans(reader);
    System.out.println(query + ":");
    int numSpans = 0;

    Hits hits = searcher.search(query);
    float[] scores = new float[2];
    for (int i = 0; i < hits.length(); i++) {
      scores[hits.id(i)] = hits.score(i);
    }

    while (spans.next()) {
      numSpans++;

      int id = spans.doc();
      Document doc = reader.document(id);

      // for simplicity - assume tokens are in sequential,
      // positions, starting from 0
      Token[] tokens = AnalyzerUtils.tokensFromAnalysis(
          analyzer, doc.get("f"));
      StringBuffer buffer = new StringBuffer();
      buffer.append("   ");
      for (int i = 0; i < tokens.length; i++) {
        if (i == spans.start()) {
          buffer.append("<");
        }
        buffer.append(tokens[i].termText());
        if (i + 1 == spans.end()) {
          buffer.append(">");
        }
        buffer.append(" ");
      }
      buffer.append("(" + scores[id] + ") ");
      System.out.println(buffer);
    }

    if (numSpans == 0) {
      System.out.println("   No spans");
    }
    System.out.println();
  }

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to