当前位置: 首页 > 知识库问答 >
问题:

在Lucene中对位置匹配词的访问

凌朗
2023-03-14

给定文档中的术语匹配,访问匹配词的最佳方式是什么?我读过这篇文章http://searchhub.org//2009/05/26/accessing-words-around-a-position-match-in-lucene/,但问题是Lucene API自这篇文章(2009)以来完全改变了,有人能告诉我在Lucene的新版本中如何做到这一点吗,比如Lucene4.6.1?

编辑:

public class TermVectorFun {
  public static String[] DOCS = {
    "The quick red fox jumped over the lazy brown dogs.",
    "Mary had a little lamb whose fleece was white as snow.",
    "Moby Dick is a story of a whale and a man obsessed.",
    "The robber wore a black fleece jacket and a baseball cap.",
    "The English Springer Spaniel is the best of all dogs.",
    "The fleece was green and red",
        "History looks fondly upon the story of the golden fleece, but most people don't agree"
  };

  public static void main(String[] args) throws IOException {
    RAMDirectory ramDir = new RAMDirectory();
    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46, new StandardAnalyzer(Version.LUCENE_46));
    config.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
    //Index some made up content
    IndexWriter writer = new IndexWriter(ramDir, config);
    for (int i = 0; i < DOCS.length; i++) {
      Document doc = new Document();
      Field id = new Field("id", "doc_" + i, Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS);
      doc.add(id);
      //Store both position and offset information
      Field text = new Field("content", DOCS[i], Field.Store.NO, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);
      doc.add(text);
      writer.addDocument(doc);
    }
    writer.close();
    //Get a searcher

    DirectoryReader dirReader = DirectoryReader.open(ramDir);
    IndexSearcher searcher = new IndexSearcher(dirReader);
    // Do a search using SpanQuery
    SpanTermQuery fleeceQ = new SpanTermQuery(new Term("content", "fleece"));
    TopDocs results = searcher.search(fleeceQ, 10);
    for (int i = 0; i < results.scoreDocs.length; i++) {
      ScoreDoc scoreDoc = results.scoreDocs[i];
      System.out.println("Score Doc: " + scoreDoc);
    }
    IndexReader reader = searcher.getIndexReader();
    Spans spans = fleeceQ.getSpans(reader.leaves().get(0), null, new LinkedHashMap<Term, TermContext>());
    int window = 2;//get the words within two of the match
    while (spans.next() == true) {
      int start = spans.start() - window;
      int end = spans.end() + window;
      Map<Integer, String> entries = new TreeMap<Integer, String>();

      System.out.println("Doc: " + spans.doc() + " Start: " + start + " End: " + end);
      Fields fields = reader.getTermVectors(spans.doc());
      Terms terms = fields.terms("content");

      TermsEnum termsEnum = terms.iterator(null);
      BytesRef text;
      while((text = termsEnum.next()) != null) {        
        //could store the BytesRef here, but String is easier for this example
        String s = new String(text.bytes, text.offset, text.length);
        DocsAndPositionsEnum positionsEnum = termsEnum.docsAndPositions(null, null);
        if (positionsEnum.nextDoc() != DocIdSetIterator.NO_MORE_DOCS) {
          int i = 0;
          int position = -1;
          while (i < positionsEnum.freq() && (position = positionsEnum.nextPosition()) != -1) {
            if (position >= start && position <= end) {
              entries.put(position, s);
            }
            i++;
          }
        }
      }
      System.out.println("Entries:" + entries);
    }
  }
}

共有1个答案

姜森
2023-03-14

使用荧光笔highlighter.getBestFragment可用于获取包含最佳匹配的文本的一部分。类似于:

TopDocs docs = searcher.search(query, maxdocs);
Document firstDoc = search.doc(docs.scoreDocs[0].doc);

Scorer scorer = new QueryScorer(query)
Highlighter highlighter = new Highlighter(scorer);
highlighter.GetBestFragment(myAnalyzer, fieldName, firstDoc.get(fieldName));
 类似资料:
  • 问题内容: 我想搜索包含许多单词的字符串,并检索与其中任何一个匹配的文档。我的索引方法如下: 这是我的搜索方法。我不想寻找特定的词组,但是其中的任何单词。用于搜索的分析器与用于索引的分析器相同。 我是Lucene的新手。有人可以帮我吗? 问题答案: 使用会精确地尝试将短语“单词列表”与短语坡度0匹配。 如果要匹配单词列表中的 任何 术语,可以使用: 或者,您也可以使用,以便您可以要求查询词的数量的

  • 我想知道如何使用Lucene获取单词在文档中的位置我已经生成了索引文件,我想从索引中提取一些信息,如索引的单词,单词在文档中的位置等

  • 问题内容: 找出查询中哪些术语与以lucene命中形式返回的给定文档相匹配的最佳方法是什么? 我尝试了一种奇怪的方法,其中涉及在Lucene Contrib中命中高亮显示包,还有一种方法针对最上面的文档(“ docId:xy AND description:each_word_in_query”)在查询中搜索每个单词。 没有得到满意的结果?点击突出显示不会报告与第一个文档不同的某些单词。我不确定第

  • 这是一个简单的问题,但请听我说完--Java家庭作业的一部分有一个密码验证器方法。要求是简单的-密码必须在6-10个字符之间,必须只由数字或字母,并必须有至少2个数字在它是有效的。我使用if语句并使用regex实现了这一点,出于某种原因,我无法使非单词字符regex匹配,尽管每个在线regex检查器都显示这应该是有效的,甚至用于regex检查的jetbrains插件也显示这应该是有效的。(我也明白

  • 问题内容: 我在网页中使用javascript。我正在尝试通过文本框搜索整个单词。假设我搜索:“我”,我应该在文本中找到所有“我”,但每个语音都找不到“ memmm”。 我正在使用javascript的search(’my regex expression’)执行当前搜索(没有成功)。 谢谢! 编辑:在使用\ b开关的几个建议[似乎不起作用]之后,我正在发布有关我的问题的修订说明: 嗯,出于某种原

  • 这看起来很简单,我确信我一定忽略了什么。我无法确定如何在Lucene中执行以下操作: 我在搜索地名。 我有一个名为的字段 它正在使用 它 的值中包含1个空格:. 由于文化上的不同拼写或真正的拼写错误,搜索词可能包含也可能不包含额外的空格。例如。而不是. 如果我使用术语,我会被击中。 如果我使用术语,我不会得到击中。 下面是我从SiteCore使用LINQ to Lucene构建谓词的代码: