Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Lucene中搜索句子并获得匹配项_Java_Search_Indexing_Lucene_Large Data - Fatal编程技术网

Java 在Lucene中搜索句子并获得匹配项

Java 在Lucene中搜索句子并获得匹配项,java,search,indexing,lucene,large-data,Java,Search,Indexing,Lucene,Large Data,我有一个应用程序,它需要我索引几GB的句子(大约1600万行) 目前我的搜索工作方式如下 我的搜索词通常围绕一个短语。例如“在公园里跑步”。我想能够搜索类似的句子或包含这些短语的一部分。我通过构造更小的短语来实现: “正在运行中” “在公园里”等等 每个人都有一个重量(越长的人体重越大) 目前,我将每一行视为一个文档。典型的搜索需要几秒钟,我想知道是否有办法提高搜索速度 除此之外,我还需要得到匹配的 例如:“我今天早上在公园慢跑”匹配“在公园”,我想知道它是如何匹配的。我知道lucene搜索的E

我有一个应用程序,它需要我索引几GB的句子(大约1600万行)

目前我的搜索工作方式如下

我的搜索词通常围绕一个短语。例如“在公园里跑步”。我想能够搜索类似的句子或包含这些短语的一部分。我通过构造更小的短语来实现:

“正在运行中” “在公园里”等等

每个人都有一个重量(越长的人体重越大)

目前,我将每一行视为一个文档。典型的搜索需要几秒钟,我想知道是否有办法提高搜索速度

除此之外,我还需要得到匹配的

例如:“我今天早上在公园慢跑”匹配“在公园”,我想知道它是如何匹配的。我知道lucene搜索的Explainer,但是有没有更简单的方法,或者有什么资源可以让我学习如何从lucene的Explainer中提取我想要的信息


我目前正在使用正则表达式获取匹配项。它很快,但不准确,因为lucene有时会忽略标点符号和其他东西,我无法处理所有特殊情况。

lucene的“contrib”模块可以让您提取lucene匹配的内容。

lucene的“contrib”模块可以让您提取lucene匹配的内容。

Highlighter比Explainer更好,它更快。 您可以在高亮显示标记后提取标记之间的匹配短语。

公共类HighlightDemo{
目录;
分析仪;
String[]contents={“在公园里跑步”,
“我今天早上在公园慢跑”,
“在路上奔跑”,
“著名的纽约马拉松比赛每年都在中央公园进行最后一英里,原因很容易理解:公园地形多样,风景优美,是终极跑步者的梦想。中央公园有许多不同难度的路径,让跑步者在这座风景如画的城市绿洲中体验清晰和自由s、 “};
@以前
public void setUp()引发IOException{
directory=new-RAMDirectory();
analyzer=新的空白分析器();
//索引文档
IndexWriter writer=新的IndexWriter(目录、分析器、IndexWriter.MaxFieldLength.UNLIMITED);
for(int i=0;i0)){
assertTrue(frag[j].toString()包含(“”);
assertTrue(frag[j].toString()包含(“”);
System.out.println(frag[j].toString());
}
}
}
}
}

荧光笔比解释笔好,速度更快。 您可以在高亮显示标记后提取标记之间的匹配短语。

公共类HighlightDemo{
目录;
分析仪;
String[]contents={“在公园里跑步”,
“我今天早上在公园慢跑”,
“在路上奔跑”,
“著名的纽约马拉松比赛每年都在中央公园进行最后一英里,原因很容易理解:公园地形多样,风景优美,是终极跑步者的梦想。中央公园有许多不同难度的路径,让跑步者在这座风景如画的城市绿洲中体验清晰和自由s、 “};
@以前
public void setUp()引发IOException{
directory=new-RAMDirectory();
analyzer=新的空白分析器();
//索引文档
IndexWriter writer=新的IndexWriter(目录、分析器、IndexWriter.MaxFieldLength.UNLIMITED);
for(int i=0;ipublic class HighlightDemo {
Directory directory;
Analyzer analyzer;
String[] contents = {"running in the park",
        "I was jogging in the park this morning",
        "running on the road",
        "The famous New York Marathon has its final miles in Central park every year and it's easy to understand why: the park, with a variety of terrain and excellent scenery, is the ultimate runner's dream. With its many paths that range in level of difficulty, Central Park allows a runner to experience clarity and freedom in this picturesque urban oasis."};


@Before
public void setUp() throws IOException {


    directory = new RAMDirectory();
    analyzer = new WhitespaceAnalyzer();

    // indexed documents


    IndexWriter writer = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);
    for (int i = 0; i < contents.length; i++) {
        Document doc = new Document();
        doc.add(new Field("content", contents[i], Field.Store.NO, Field.Index.ANALYZED)); // store & index
        doc.add(new NumericField("id", Field.Store.YES, true).setIntValue(i));      // store & index
        writer.addDocument(doc);
    }
    writer.close();
}

@Test
public void test() throws IOException, ParseException, InvalidTokenOffsetsException {
    IndexSearcher s = new IndexSearcher(directory);
    QueryParser parser = new QueryParser(Version.LUCENE_36, "content", analyzer);
    org.apache.lucene.search.Query query = parser.parse("park");

    TopDocs hits = s.search(query, 10);
    SimpleHTMLFormatter htmlFormatter = new SimpleHTMLFormatter();
    Highlighter highlighter = new Highlighter(htmlFormatter, new QueryScorer(query));
    for (int i = 0; i < hits.scoreDocs.length; i++) {
        int id = hits.scoreDocs[i].doc;
        Document doc = s.doc(id);
        String text = contents[Integer.parseInt(s.doc(id).get("id"))];

        TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(text));
        org.apache.lucene.search.highlight.TextFragment[] frag = highlighter.getBestTextFragments(tokenStream, text, false, 10);
        for (int j = 0; j < frag.length; j++) {
            if ((frag[j] != null) && (frag[j].getScore() > 0)) {
                assertTrue(frag[j].toString().contains("<B>"));
                assertTrue(frag[j].toString().contains("</B>"));

                System.out.println(frag[j].toString());
            }
        }

    }

}
}