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
Search 使用Lucene的增量搜索_Search_Lucene - Fatal编程技术网

Search 使用Lucene的增量搜索

Search 使用Lucene的增量搜索,search,lucene,Search,Lucene,我想使用lucene进行增量搜索。我在单词之间有空白。 说“印度今天”。我的搜索查询返回 今日印度 今天是印度时间 今天是印度时间 我希望搜索结果是sql中的“India today%”。 但这并没有发生。我试着使用短语查询,但这对精确搜索有效。我存储的数据没有经过分析,所以我可以用空格进行搜索 KeywordAnalyzer analyzer = new KeywordAnalyzer (); PhraseQuery pq = new PhraseQuery(); pq.add(ne

我想使用lucene进行增量搜索。我在单词之间有空白。 说“印度今天”。我的搜索查询返回

  • 今日印度
  • 今天是印度时间
  • 今天是印度时间
我希望搜索结果是sql中的“India today%”。 但这并没有发生。我试着使用短语查询,但这对精确搜索有效。我存储的数据没有经过分析,所以我可以用空格进行搜索

KeywordAnalyzer analyzer = new KeywordAnalyzer (); 

PhraseQuery pq = new  PhraseQuery();
pq.add(new Term("name", "MR DANIEL KELLEHER")); 


int hitsPerPage = 1000;
IndexReader reader = IndexReader.open(index);
IndexSearcher searcher = new IndexSearcher(reader);
TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);
searcher.search(pq, collector);
我不能得到像中间有空格的查询。我也参考了很多关于net和stackoverflow的文章,但没有得到解决方案

package org.lucenesample;

import org.apache.lucene.search.Query;

import org.apache.lucene.*;
import org.apache.lucene.analysis.*;
import org.apache.lucene.analysis.standard.*;
import org.apache.lucene.analysis.standard.std31.*;
import org.apache.lucene.analysis.tokenattributes.*;
import org.apache.lucene.collation.*;
import org.apache.lucene.document.*;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.*;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.messages.*;
import org.apache.lucene.queryParser.*;
import org.apache.lucene.search.*;
import org.apache.lucene.search.function.*;
import org.apache.lucene.search.payloads.*;
import org.apache.lucene.search.spans.*;
import org.apache.lucene.store.*;
import org.apache.lucene.util.*;
import org.apache.lucene.util.fst.*;
import org.apache.lucene.util.packed.*;

import java.io.File;
import java.sql.*;
import java.util.HashMap;

public class ExactPhrasesearchUsingStandardAnalyser {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        Directory directory = new RAMDirectory();
        StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
        MaxFieldLength mlf = MaxFieldLength.UNLIMITED;
        IndexWriter writer = new IndexWriter(directory, analyzer, true, mlf);
        writer.addDocument(createDocument1("1", "foo bar baz blue"));
        writer.addDocument(createDocument1("2", "red green blue"));
        writer.addDocument(createDocument1("3", "test panda foo & bar testt"));
        writer.addDocument(createDocument1("4", " bar test test foo in panda  red blue "));
        writer.addDocument(createDocument1("4", "test"));
        writer.close();

    IndexSearcher searcher = new IndexSearcher(directory);
    PhraseQuery query = new PhraseQuery();


    QueryParser qp2 = new QueryParser(Version.LUCENE_35, "contents", analyzer);
    //qp.setDefaultOperator(QueryParser.Operator.AND);
    Query queryx2 =qp2.parse("test foo in panda re*");//contains query
    Query queryx23 =qp2.parse("+red +green +blu*"  );//exact phrase match query.Make last word as followed by star
    Query queryx234 =qp2.parse("(+red +green +blu*)& (\"red* green\") "  );





     /*String term = "new york";
        // id and location are the fields in which i want to search the "term"
        MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
                                           Version.LUCENE_35,
                                           { "contents"},
                                           new KeywordAnalyzer());
        Query query = queryParser.parse(term);
        System.out.println(query.toString());*/

    QueryParser qp = new QueryParser(Version.LUCENE_35, "contents", analyzer);
    //qp.setDefaultOperator(QueryParser.Operator.AND);

    Query queryx =qp.parse("\"air quality\"~10");
    System.out.println("******************Searching Code starts******************");
    TopDocs topDocs = searcher.search(queryx2, 10);
    for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
        Document doc = searcher.doc(scoreDoc.doc);
        System.out.println(doc+"testtttttttt");
    }

}



   private static Document createDocument1(String id, String content) {
        Document doc = new Document();
        doc.add(new Field("id", id, Store.YES, Index.NOT_ANALYZED));
        doc.add(new Field("contents", content, Store.YES, Index.ANALYZED,
                Field.TermVector.WITH_POSITIONS_OFFSETS));
        System.out.println(content);
        return doc;
    }
}

我尝试过这种方法。我可以搜索包含格式。但我无法获得“开始”选项,因此当用户按“印度到”时,“印度明天”和“印度今天”结果也会出现。我可以在按“+印度*+到*”时接近它,但结果是“印度今天”还有。在用户输入完成“今天”之前,我无法获得搜索结果。基本上,我希望短语查询“印度今天”能够正常工作。

对于已分析的字段,一种方法是使用已枚举的:

<MultiPhraseQuery: field:"india (today todays)">

或者可以使用a,优点是它可以处理术语扩展

<SpanNearQuery: spanNear([field:india, SpanMultiTermQueryWrapper(field:today*)], 0, true)>

对于已分析的字段,一种方法是使用已枚举的:

<MultiPhraseQuery: field:"india (today todays)">

或者可以使用a,优点是它可以处理术语扩展

<SpanNearQuery: spanNear([field:india, SpanMultiTermQueryWrapper(field:today*)], 0, true)>


前缀查询是你想要的吗?前缀查询也不支持中间的空格。我也试过了。前缀查询是你想要的吗?前缀查询也不支持中间的空格。我也试过了。嗨,科迪,你能给出这个例子的代码吗..我不知道如何使用spanMultiTermQueryRapper.SpanMultiTermQuery普通lucene 3.5中不存在包装器。其他选项是什么?它应该在java lucene 3.5中。以下是文档中的示例。`WildcardQuery wildcard=new WildcardQuery(新术语(“字段”,“兄弟”);SpanQuery spanWildcard=new spanMultitermQueryRapper(通配符)5944")); span查询span通配符=新的spanMultiTermQueryRapper(通配符)`