elasticsearch Lucene|如何在字段开头找到前缀匹配?

bvhaajcl  于 2023-06-21  发布在  ElasticSearch
关注(0)|答案(2)|浏览(192)

我想匹配字段开头附近的前缀。我有这个,但它不匹配的前缀;如果搜索项与它匹配,则它仅与整个词匹配。似乎没有办法将SpanTermQuery和PrefixQuery结合起来。

var nameTerm = new Term("name", searchTerm);

        var prefixName = new PrefixQuery(nameTerm);

        var prefixAtStart = new BooleanQuery
        {
            { prefixName, Occur.MUST },
            {  new SpanFirstQuery(new SpanTermQuery(nameTerm), 0), Occur.MUST }
        };

例如:

  • 检索词:"Comp"
  • 要查找:"Computer science class""Comp Sci"
  • 唯一发现:"Comp Sci"
  • 不想找到:"Apple's latest computer"

RegexpQuery可以理解位置吗?

f2uvfpb9

f2uvfpb91#

当你只想匹配前缀时,你可以通过为你的字段设置下面的字段类型来完成。

<analyzer>
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.LowerCaseFilterFactory"/>
</analyzer>

那么在这种情况下,查询将是:

field:comp*

现在你有一个第二个你需要NGramFilter,所以你可以使用下面的字段类型为您的字段。

<field name="text_prefix" type="text_prefix" indexed="true" stored="false"/>

<fieldType name="text_prefix" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.LowerCaseTokenizerFactory"/>
            <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" side="front"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.LowerCaseTokenizerFactory"/>
        </analyzer>
    </fieldType>
kcrjzv8t

kcrjzv8t2#

翻译Abhijit的回应,这里是Lucene.Net设置EdgeNGramFilter的方法:

public class CustomAnalyzer : Analyzer
{
    protected override TokenStreamComponents CreateComponents(string fieldName, TextReader reader)
    {
        Tokenizer tokenizer = new StandardTokenizer(LuceneVersion.LUCENE_48, reader);

        TokenFilter filter = new EdgeNGramTokenFilter(LuceneVersion.LUCENE_48, tokenizer, 3, 10);

        return new TokenStreamComponents(tokenizer, filter);
    }
}

相关问题