【问题标题】:Elasticsearch - Same search result for "and" and "ampersand"(&) in queryElasticsearch - 查询中“and”和“ampersand”(&) 的相同搜索结果
【发布时间】:2019-04-06 07:21:27
【问题描述】:

"在 Elasticsearch 中设计一个索引,以便查询中的 "&" 和 "and" 返回相同的结果"

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

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

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

因此在这种情况下,无论是使用“and”还是“&”完成搜索都应该返回 1,2,3。

从我的 Kibana 开发工具中转储

PUT 测试索引 { “设置”:{“number_of_replicas”:0, “number_of_shards”:1 }, “映射”:{ “文档”: { “特性”: { “电影名称”:{“类型”:“文本”} } } } }

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. GET test_index/_search { “大小”:20, “询问”: { “匹配”: { “电影名”:“&” } } }

  2. GET test_index/_search { “大小”:20, “询问”: { “匹配”: { “电影名”:“和” } } }

【问题讨论】:

    标签: elasticsearch indexing


    【解决方案1】:

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

    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 获取帮助文档

    【讨论】:

    • 谢谢@ookboy24 我尝试了第二个选项,它有效(我将粘贴下面的 kibana 转储以帮助其他有类似问题的人)。如果您没有这些标记,选项 1 如何适合,因为搜索是直接在 &and 上完成的。
    • PUT my_index { .... "type": "pattern_replace", "pattern": "&", "replacement": "and" ... "mappings": { ... "类型”:“文本”,“分析器”:“my_analyzer”.. PUT my_index/doc/1 {“电影名称”:“杰克和吉尔”} ...“查询”:{“匹配”:{“电影名称”: “和”}
    【解决方案2】:
    {
      "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
        }
      ]
    }
    

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

    {
      "tokens": []
    }
    

    原因:在 ES 中 - 当您创建 Text 类型的字段时,符号被删除。

    【讨论】:

    • 谢谢@Backtrack
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    相关资源
    最近更新 更多