使用elasticsearch对整个单词进行部分匹配 - 匹配末尾或中间部分

时间:2014-05-29 15:13:44

标签: elasticsearch nest

我已经阅读了大量的文档,但现在对如何匹配搜索中的部分单词感到困惑。我知道有很多技巧,但大多数人都在谈论匹配单词的第一部分。例如' quick'可以匹配快速的棕色狐狸'。

好吧,如果我有“结束游戏”这个词怎么办?我正在寻找,但输入查询是游戏'?我尝试过使用标准,关键字,空格等标记符,但我没有得到它。

我确定我错过了一些简单的事情。

更新

我能够在约翰的帮助下实现这一点。这是使用Nest ...

的实现
var ngramTokenFilter = new NgramTokenFilter
{
    MinGram = 2,
    MaxGram = 3
};

var nGramTokenizer = new NGramTokenizer
{
    MinGram = 2, MaxGram = 3, TokenChars = new List<string>{"letter", "digit"}
};

var nGramAnalyzer = new CustomAnalyzer
{
    Tokenizer = "nGramTokenizer",
    Filter = new[] { "ngram", "standard", "lowercase" }
};


client.CreateIndex("myindex", i =>
{
    i
        .Analysis(a => a.Analyzers(an => an             
            .Add("ngramAnalyer", nGramAnalyzer)
            )
            .Tokenizers(tkn => tkn
                .Add("nGramTokenizer", nGramTokenizer)
            )
            .TokenFilters(x => x
                .Add("ngram", ngramTokenFilter)
                )
            )
            ...

和我的poco,我实际创建了一个多字段,一个未分析,一个用我的ngram tokenizer分析器:

pm.Properties(props => props
    .MultiField(mf => mf
        .Name("myfield")
        .Fields(f => f
            .String(s => s.Name("myfield").Analyzer("ngramAnalyer"))
            .String(s => s.Name("raw").Index(FieldIndexOption.not_analyzed))
        )
    )
);              

1 个答案:

答案 0 :(得分:1)

我会尝试使用ngram标记器:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html

以下示例相当极端(它会创建2个和3个字母的标记),但应该让您知道它是如何工作的:

curl -XPUT 'localhost:9200/test' -d '
    {
        "settings" : {
            "analysis" : {
                "analyzer" : {
                    "my_ngram_analyzer" : {
                        "tokenizer" : "my_ngram_tokenizer"
                    }
                },
                "tokenizer" : {
                    "my_ngram_tokenizer" : {
                        "type" : "nGram",
                        "min_gram" : "2",
                        "max_gram" : "3",
                        "token_chars": [ "letter", "digit" ]
                    }
                }
            }
        }
    }'

curl 'localhost:9200/test/_analyze?pretty=1&analyzer=my_ngram_analyzer' -d 'FC Schalke 04' 
Result: FC, Sc, Sch, ch, cha, ha, hal, al, alk, lk, lke, ke, 04

这将允许您将令牌分解为可配置大小的较小标记并搜索它们。你需要为你的用例使用min_gram和max_gram。

这可能会产生一些内存影响,但往往比具有尾随或前导通配符(或两者)的通配符搜索快得多。 http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html