当前位置: 首页 > 知识库问答 >
问题:

如何在elasticsearch中匹配包含连字符或尾随空格的查询词

田骁
2023-03-14

在elasticsearch映射的mapping char_filter部分,它有点模糊,我很难理解是否以及如何使用charfilter analyzer:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-mapping-charfilter.html

基本上,我们存储在索引中的数据是类型为String的ID,如下所示:“00839234200”。当查询词实际上包含连字符或尾随空格时,我希望能够搜索这样的ID:“008392342-000”

您建议我如何设置分析仪?目前,这是该字段的定义:

"mappings": {
    "client": {
        "properties": {
            "ucn": {
                "type": "multi_field",
                "fields": {
                    "ucn_autoc": {
                        "type": "string",
                        "index": "analyzed",
                        "index_analyzer": "autocomplete_index",
                        "search_analyzer": "autocomplete_search"
                    },
                    "ucn": {
                        "type": "string",
                        "index": "not_analyzed"
                    }
                }
            }
        }
    }
}

以下是包含分析器等的索引的设置。

 "settings": {
        "analysis": {
            "filter": {
                "autocomplete_ngram": {
                    "max_gram": 15,
                    "min_gram": 1,
                    "type": "edge_ngram"
                },
                "ngram_filter": {
                    "type": "nGram",
                    "min_gram": 2,
                    "max_gram": 8
                }
            },
            "analyzer": {
                "lowercase_analyzer": {
                    "filter": [
                        "lowercase"
                    ],
                    "tokenizer": "keyword"
                },
                "autocomplete_index": {
                    "filter": [
                        "lowercase",
                        "autocomplete_ngram"
                    ],
                    "tokenizer": "keyword"
                },
                "ngram_index": {
                    "filter": [
                        "ngram_filter",
                        "lowercase"
                    ],
                    "tokenizer": "keyword"
                },
                "autocomplete_search": {
                    "filter": [
                        "lowercase"
                    ],
                    "tokenizer": "keyword"
                },
                "ngram_search": {
                    "filter": [
                        "lowercase"
                    ],
                    "tokenizer": "keyword"
                }
            },
            "index": {
                "number_of_shards": 6,
                "number_of_replicas": 1
            }
        }
    }

共有1个答案

田成化
2023-03-14

您还没有提供实际的分析仪、输入的数据以及您的期望值,但根据您提供的信息,我将从以下内容开始:

{
  "settings": {
    "analysis": {
      "char_filter": {
        "my_mapping": {
          "type": "mapping",
          "mappings": [
            "-=>"
          ]
        }
      },
      "analyzer": {
        "autocomplete_search": {
          "tokenizer": "keyword",
          "char_filter": [
            "my_mapping"
          ],
          "filter": [
            "trim"
          ]
        },
        "autocomplete_index": {
          "tokenizer": "keyword",
          "filter": [
            "trim"
          ]
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "ucn": {
          "type": "multi_field",
          "fields": {
            "ucn_autoc": {
              "type": "string",
              "index": "analyzed",
              "index_analyzer": "autocomplete_index",
              "search_analyzer": "autocomplete_search"
            },
            "ucn": {
              "type": "string",
              "index": "not_analyzed"
            }
          }
        }
      }
    }
  }
}

字符过滤器将不使用任何内容替换--=

测试分析器GET/my\u index/\u analyze?analyzer=自动完成搜索

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

这意味着它确实消除了-和空白。典型的查询是:

{
  "query": {
    "match": {
      "ucn.ucn_autoc": " 0123-34742-000  "
    }
  }
}

 类似资料:
  • 问题内容: 我必须找到具有字符串的匹配文档,例如:在某些“键”范围内的字符串:“ sky”。当我编写单独的匹配和范围查询时,我从ES中获得了输出,但是合并在一起时会抛出异常。 范围查询: 匹配查询: 组合查询: 组合查询在执行时会引发错误: 引发HTTP_EXCEPTIONS.get(状态码,TransportError)(状态码,error_message,Additional_info)ela

  • 我正在尝试使用Selenium和python单击以下按钮: 这只是一个简单的按钮,如下所示: 代码: 这将导致以下异常: 所以,我尝试使用。 (使用访问第二个元素,因为第一个元素将导致

  • 我试图从地址字符串中仅选择街道/单元号。 我的正则表达式模式是 目前,我的正则表达式在任何字母字符之前匹配'/'和。然而,我想排除拖尾。 我的正则表达式匹配 Sydney Road,Manly NSW(注意“2”后面的空格字符) 而不是 新南威尔士州曼利市悉尼路 以下是一些示例地址字符串: 新南威尔士州曼利市悉尼路61/2号

  • 问题内容: 精简版: 我想使用Nest编写一个elasticsearch查询,以获取已被索引的完整索引项(在我的情况下为自定义类型)。该查询受[somestring] + *(即String.StartsWith())的术语查询的约束,其中[somestring]可能包含空格,也可能不包含空格。 这与由于我需要检索完整对象而不是字符串建议而不同。 到目前为止,我已经尝试过: 当我查询没有空格的文本

  • 我是Elasticsearch新手,对匹配查询的工作方式感到困惑。我有以下映射: 我批量导入了以下文档 我验证了所有文档都已成功加载。然后我执行匹配查询: 它只返回#1文档。我在这里感到困惑。为什么它不返回所有三个文档?我应该使用什么查询来返回这三个文档,因为它们在字段中都有“quiet”根单词? 谢谢和问候。

  • 问题内容: 该函数会删除尾部和前导空格,但是,如果我只想删除字符串的尾部空格,该怎么办? 问题答案: 如果您使用的是JDK 11或更高版本,则可能应该使用stripTrailing()。 早期的JDK版本 使用正则表达式,您可以将所有尾随空格字符(包括空格和制表符)替换为空字符串()。 输出量 在线演示。 这是正则表达式的细分: –任何空白字符, –匹配一个或多个先前的令牌(可能);即,匹配一个或