我已经阅读了大量的文档,但现在对如何匹配搜索中的部分单词感到困惑。我知道有很多技巧,但大多数人都在谈论匹配单词的第一部分。例如' 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))
)
)
);
答案 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