无法搜索令牌等于* abc

时间:2014-11-05 19:55:10

标签: elasticsearch nest

让我们说我的文件索引的名称如下: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,

1 个答案:

答案 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