gpt4 book ai didi

c# - Lucene.Net NGramAnalyzer 使用引用的 ngram 生成查询,例如 [ titleNGram :"his ist sto tor ory"] 而不是 [ titleNGram :his ist sto tor ory]

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:00 26 4
gpt4 key购买 nike

关注

https://github.com/Sitecore/autohaus/blob/master/Autohaus.Custom/Indexing/Analyzers/NGramAnalyzer.cs

我创建了这个自定义分析器

public class NGramAnalyzer : Analyzer
{
private readonly Version _version;
private readonly int _minGram;
private readonly int _maxGram;

public NGramAnalyzer(Version version, int minGram = 2, int maxGram = 8)
{
_version = version;
_minGram = minGram;
_maxGram = maxGram;
}

public override TokenStream TokenStream(string fieldName, TextReader reader)
{
// Splits words at punctuation characters, removing punctuation.
// Splits words at hyphens, unless there's a number in the token...
// Recognizes email addresses and internet hostnames as one token.
var tokenizer = new StandardTokenizer(_version, reader);

TokenStream filter = new StandardFilter(tokenizer);

// Normalizes token text to lower case.
filter = new LowerCaseFilter(filter);

// Removes stop words from a token stream.
filter = new StopFilter(true, filter, StopAnalyzer.ENGLISH_STOP_WORDS_SET);

return new NGramTokenFilter(filter, _minGram, _maxGram);

}
}

我遇到的问题是它以

的形式生成查询
[ titleNGram:"his ist sto tor ory" ] instead of [ titleNGram:his ist sto tor ory]

对于[历史]。注意第一个引号

如何让它不引用查询。

我在这里找到了关于 Java Lucene 的类似讨论

https://forum.hibernate.org/viewtopic.php?f=9&t=999916&view=next

有没有一种方法可以解决这个问题而不导致解决方法。

我正在使用 PerFieldAnalyzerWrapper,使用变通方法似乎不会很干净。

感谢任何帮助

最佳答案

我想在我自己的自动完成实现中使用 NGramAnalyzer,这是生成我正在寻找的我能找到的东西的唯一尝试,所以这就是我开始的地方。

我遇到了您描述的相同问题,并且想出了一个相当干净的解决方法。

原因似乎在 QueryParser.cs:494 处的 Query GetFieldQuery(String field, String queryText) 中。这最终被称为 QueryParser.Parse 的一部分。如果有多个标记要添加到查询中(“his”、“ist”等等是多个标记)并且名为 severalTokensAtSamePosition 的 bool 值是 false,则 GetFieldQuery 构造一个短语查询(第 677 行)并在返回之前将所有标记添加到其中(第 705 行)。

我们想要的是将所有标记添加到 bool 查询中,使用 Occur.SHOULD。我试图继承 QueryParser 并覆盖 GetFieldQuery,因为它被标记为 virtual。但是,我需要复制其余的功能,并且发现有很多对 private 变量的引用。相反,我想出了如何从解析的查询中提取标记并将它们插入到 BooleanQuery 中,然后再运行搜索:

var query = new BooleanQuery();

foreach( var word in terms ) {
var parsed = parser.Parse( word );

var extractedTerms = new HashSet<Term>();
parsed.ExtractTerms( extractedTerms );
foreach( var term in extractedTerms ) {
query.Add( new TermQuery( term ), Occur.SHOULD );
}
}

var resultDocs = searcher.Search( query, maxResults ).ScoreDocs;

这似乎可行。我仍在努力确定 minGrammaxGram 的最佳值,以及处理长度小于 minGram 的术语的最佳方法, 但这是一个好的开始。

关于c# - Lucene.Net NGramAnalyzer 使用引用的 ngram 生成查询,例如 [ titleNGram :"his ist sto tor ory"] 而不是 [ titleNGram :his ist sto tor ory],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23793262/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com