Java NGramIndex建筑与质疑

Java NGramIndex建筑与质疑,java,lucene,indexing,Java,Lucene,Indexing,我试图用lucene 4.3.1实现一个基于索引的文本搜索。代码如下。我使用au-NGramTokenyzer创建了索引,因为我想查找距离FuzzyQuery太远的搜索结果。 我的解决方案有两个问题。首先,我不明白为什么它能找到一些东西,而另一些却找不到。例如,如果我查找“Buter”、“utter”或“Bute”,它会找到“Butter”,但如果我查找“Btter”,则没有结果。我的实现中是否有错误,我应该做些什么? 此外,我希望它总是为每个查询提供(例如)10个结果。这是我的代码可以实现的,

我试图用lucene 4.3.1实现一个基于索引的文本搜索。代码如下。我使用au-NGramTokenyzer创建了索引,因为我想查找距离FuzzyQuery太远的搜索结果。 我的解决方案有两个问题。首先,我不明白为什么它能找到一些东西,而另一些却找不到。例如,如果我查找“Buter”、“utter”或“Bute”,它会找到“Butter”,但如果我查找“Btter”,则没有结果。我的实现中是否有错误,我应该做些什么? 此外,我希望它总是为每个查询提供(例如)10个结果。这是我的代码可以实现的,或者我需要做什么改变才能得到这10个结果

代码如下:

public LuceneIndex() throws IOException{
    File dir = new File(indexDirectoryPath);
    index = FSDirectory.open(dir);
    analyzer = new NGramAnalyzer();
    config = new IndexWriterConfig(luceneVersion, analyzer);
    indexWriter = new IndexWriter(index, config);
    reader = DirectoryReader.open(FSDirectory.open(dir));
    searcher = new IndexSearcher(reader);
    queryParser = new QueryParser(luceneVersion, "label", new NGramAnalyzer());


}

/**
 *  building the index 
 * @param graph
 * @throws IOException
 */
public void makeIndex(MyGraph graph) throws IOException {
    FieldType fieldType = new FieldType();
    fieldType.setTokenized(true);

    //read the items that should be indexed
    ArrayList<String> DbList = Helper.readListFromFileDb(indexFilePath);
    for (String word : DbList) {
        Document doc = new Document();
        doc.add(new TextField("label", word, Field.Store.YES));
        indexWriter.addDocument(doc);
    }

    indexWriter.close();

}


public void searchIndexWithQueryParser(String searchString, int numberOfResults) throws IOException, ParseException {
System.out.println("Searching for '" + searchString + "' using QueryParser");

Query query = queryParser.parse(searchString);

System.out.println(query.toString());


TopDocs results = searcher.search(query, numberOfResults);
ScoreDoc[] hits = results.scoreDocs;

//just to see some output...
int i = 0;

Document doc = searcher.doc(hits[i].doc);
String label = doc.get("label");

System.out.println(label);
}

我假设NGramAnalyzer是您实现的东西,对吗?你能提供它的来源吗?是的,你是对的,我在我的问题中添加了代码。
public class NGramAnalyzer extends Analyzer {

int minGram = 2;
int maxGram = 2;



@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {

    Tokenizer source = new NGramTokenizer(reader, minGram, maxGram);
    CharArraySet charArraySet = StopFilter.makeStopSet(Version.LUCENE_43,
            FoodProductBlackList.blackList, true);
    TokenStream filter = new StopFilter(Version.LUCENE_43, source, charArraySet);

    return new TokenStreamComponents(source, filter);
}
}