【问题标题】:unable to search token equals *abc无法搜索令牌等于 *abc
【发布时间】:2014-11-07 23:38:39
【问题描述】:

假设我索引了名称如下的文档:1:abc, 2:*abc, 3:abc def, 4:def *abc, 5: 1abc

我想要这样的搜索:

搜索=abc 结果=1,2,3,4,5 搜索=*abc 结果=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 成功,但第二个(带“*”)返回与第一个相同。有没有办法指定多个标记器来完成我的预期?

有什么想法吗?

谢谢,

【问题讨论】:

  • 您在映射中使用什么分析器?如果您想将 * 视为数据而不被忽略,您可能需要切换到 Whitespace analyzer

标签: elasticsearch nest


【解决方案1】:

这样做:

搜索=abc 结果=1,2,3,4,5 搜索=*abc 结果=2,4

当您在字符串中搜索(在“*abc”中查找“abc”)并且您不希望搜索“*abc”来匹配“*def abc”时,我会使用@987654321 @ 标记数据。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多