让我们说我的文件索引的名称如下:1:abc,2:* abc,3:abc def,4:def * abc,5:1abc
我希望搜索的行为如下:
搜索= abc结果= 1,2,3,4,5 Search = * abc result = 2,4
我使用如下定义的自定义分析器:
Add("myAnalyzer", new CustomAnalyzer
{
Tokenizer = "myTokenizer",
Filter = new[]
{
"myAsciiFolding"
,"lowercase"
,"ipPattern"
}
}
使用如下定义的tokenizer:
Add("ipTokenizer", new PatternTokenizer
{
Pattern = @"\W+"
})
和AsciiFolding这样:
Add("ipAsciiFolding", new AsciiFoldingTokenFilter
{
PreserveOriginal = true
})
实际上搜索1成功但第二个(' *')返回与第一个相同。有没有办法指定多个标记化器来完成我的预期?
任何想法?
THX,
答案 0 :(得分:1)
这样做:
搜索= abc结果= 1,2,3,4,5搜索= * abc结果= 2,4
当你在一个字符串中搜索(寻找" abc"在" * abc"内)并且你不想要搜索" * ABC"要匹配" * def abc",我会使用nGrams来标记数据。
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" : "5",
"token_chars": [ "letter", "digit", "punctuation", "symbol" ]
}
}
}
}
}'
如果您的条款(* abc等)都是5个字符或更少,那么我会使用term查询(即您将在索引中找到完全匹配的字词。
如果您的字词超过5个字符,我会使用query_string并将 default_operator 设置为AND