Elasticsearch-查询中“ and”和“&”(&)的搜索结果相同

时间:2018-11-02 02:30:15

标签: elasticsearch indexing

在Elasticsearch中设计索引,以使查询中的“&”和“ and”返回相同的结果

无论使用“ ”作为查询字符串还是使用“&”和“ ”进行搜索,我们如何使Elasticsearch返回相同的结果。

例如,有一个查询来查找名称中包含“ 和/&”的所有电影标题。

  1. 先生&史密斯夫人
  2. 杰克和吉尔
  3. Abc和Def&ghi
  4. 虚拟名称

因此,在这种情况下,查询中是否使用“ and”或“&”进行搜索都应该返回1,2,3。

从我的Kibana开发工具中转储

PUT test_index {   “ settings”:{“ number_of_replicas”:0,     “碎片数”:1   },   “映射”:{     “ doc”:     {       “属性”:{         “ movie_name”:{“ type”:“ text”}       }     }   } }

PUT / test_index / doc / 1 {   “ movie_name”:“史密斯先生和夫人” }

PUT / test_index / doc / 2 {   “ movie_name”:“杰克和吉尔” }

PUT / test_index / doc / 3 {   “ movie_name”:“ Abc和Def&ghi” }

PUT / test_index / doc / 4 {   “ movie_name”:“虚拟名称” }

以下两个查询应返回相同的结果

  1. 获取test_index / _search { “大小”:20, “查询”:{ “比赛”: {   “ movie_name”:“&” } } }

  2. 获取test_index / _search { “大小”:20, “查询”:{ “比赛”: {   “ movie_name”:“和” } } }

2 个答案:

答案 0 :(得分:3)

有两种方法可以做到这一点

  1. 使用 english 分析器,该分析器将删除文本中的特殊字符以及停用词(例如“ and”),因此实质上,您的搜索将与不带&/的标记匹配因此将是相同的。有关帮助文档,请参见https://www.elastic.co/guide/en/elasticsearch/reference/6.4/analysis-lang-analyzer.html

  2. 保留您的标准分析器,并添加一个字符替换过滤器,以将任何出现的“&”模式替换为“和”,然后所有这些搜索将发出相同的标记。有关帮助文档,请参见https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-pattern-replace-charfilter.html

答案 1 :(得分:0)

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "char_filter": [
            "my_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "mapping",
          "mappings": [
            "+ => plus",
            "& => and"
          ]
        }
      }
    }
  }
}

您应该创建char过滤器来执行此操作。

使用上述分析器创建索引

POST my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "&"
}

输出:

{
  "tokens": [
    {
      "token": "and",
      "start_offset": 0,
      "end_offset": 1,
      "type": "word",
      "position": 0
    }
  ]
}

如果在没有上述字符过滤器分析器的情况下运行上述分析,您将获得

{
  "tokens": []
}

原因:在ES中-使用文本类型创建字段时,符号被删除。