如何构建一个匹配带有特殊字符的文本的Elasticsearch短语查询?

时间:2017-08-18 08:00:55

标签: elasticsearch match special-characters querying

在过去的几天里,我一直在玩弹性搜索索引和搜索,我将构建我想要的不同查询。我现在的问题是能够构建一个能够将文本与特殊字符匹配的查询,即使我没有在“搜索栏”中输入它们。我举一个例子来轻松解释我的意思。

想象一下,您的索引文档包含一个名为page content的字段。在此字段中,您可以拥有部分文本,例如

  

“O carrodoJoãoépreto。” (意味着João的汽车是葡萄牙语的黑色)

我希望能够输入的内容如下:

  

O carro do joao e preto

仍然能够得到正确的匹配。

到目前为止我尝试过:

  1. 我一直在使用elasticsearch(here)文档中提供的匹配词组查询,例如下面的示例:

    GET _search
    {
        "query": {
                "match_phrase": {
                    "page content": 
                    {
                        "query": "o carro do joao e preto"
                    }
                }
        }
     }
    
  2. 此查询的结果为我提供了0次点击。鉴于所提供的查询内容与该文档中存储的内容不同,这是完全可以接受的。

    1. 我尝试过设置ASCII折叠令牌过滤器(here),但我不知道如何使用它。所以我基本上做的是用这个查询创建一个新的索引:

      PUT /newindex '
      {
          "page content": "O carro do João é preto",
          "settings" : {
              "analysis" : {
                  "analyzer" : {
                      "default" : {
                          "tokenizer" : "standard",
                          "filter" : ["standard", "my_ascii_folding"]
                      }
                  },
                  "filter" : {
                      "my_ascii_folding" : {
                          "type" : "asciifolding",
                          "preserve_original" : true
                      }
                  }
              }
          }
      }'
      
    2. 然后,如果我尝试使用上面提供的match_phrase查询进行查询,请执行以下操作:

        

      O carro do joao e preto

      它应该向我展示我想要的正确结果。但事情是它不适合我。我忘记了什么吗?过去两天我一直在这里没有成功,我觉得这是我缺少的东西。

      所以问题:我需要做些什么来获得所需的匹配?

1 个答案:

答案 0 :(得分:0)

管理以找到我自己的问题的答案。在创建索引时,我不得不稍微更改分析器。有关此previous answer的详细信息:

我的代码现在:

{
    "settings" : {
        "analysis" : {
            "analyzer" : {
                "default" : {
                    "tokenizer" : "standard",
                    "filter" : ["standard", "lowercase", "asciifolding"]
                },
                "text" : {
                    "tokenizer" : "standard",
                    "filter" : ["standard", "lowercase"],
                    "char_filter" : "html_strip"
                },
                "sortable" : {
                    "tokenizer" : "keyword",
                    "filter" : ["lowercase"],
                    "char_filter" : "html_strip"
                }
            }
        }
    }
}