首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >elasticsearch ngram反斜杠转义

elasticsearch ngram反斜杠转义
EN

Stack Overflow用户
提问于 2021-01-19 19:47:14
回答 1查看 49关注 0票数 0

我在我的弹性搜索索引上使用了ngram分析器。这是我所需要的搜索能力所必需的。我正在搜索一个名为"l/test_V0001“的文档。当我使用"l/test“进行搜索时,我只能得到"l”的结果,/是一个转义字符,而不是一个文本。我已经搜索并发现这是一个常见的问题和预期,但找不到解决办法。

当我在API中搜索"l/test_V0001“时,我可以找到我想要的结果。然而,当通过java API执行相同的搜索时,我仍然只能得到"l“的结果。

以下是API搜索:

代码语言:javascript
复制
 {
    "query": {
        "multi_match": {
            "query": "l/test_V0001",
            "fields": ["name", "name.partial", "name.text"]
        }
    }
}

和索引的映射:

代码语言:javascript
复制
{
  "settings": {
    "index": {
      "max_ngram_diff": 20,
      "search.idle.after": "10m"
    },
    "analysis": {
      "analyzer": {
        "ngram3_analyzer": {
          "tokenizer": "ngram3_tokenizer",
          "filter": [
            "lowercase"
          ]
        }
      },
      "tokenizer": {
        "ngram3_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 20
        }
      }
    }
  },
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "name": {
        "type": "keyword",
        "fields": {
          "partial": {
            "type": "text",
            "analyzer": "ngram3_analyzer",
            "search_analyzer": "keyword"
          },
          "text": {
            "type": "text"
          }
        }
      },
      "value": {
        "type": "integer"
      }
    }
  }
}

这方面的任何帮助或解决办法都是很棒的!

EN

回答 1

Stack Overflow用户

发布于 2021-01-22 00:03:24

因此,经过一些挖掘,我找到了使用自定义令牌字符的答案。这已添加到索引映射中:

代码语言:javascript
复制
"tokenizer": {
        "ngram3_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 20,
          "token_chars": [
            "letter",
            "digit",
            "symbol",
            "custom"
          ],
          "custom_token_chars": "/"
        }

所以我的完整索引现在看起来是这样的:

代码语言:javascript
复制
{
  "settings": {
    "index": {
      "max_ngram_diff": 20,
      "search.idle.after": "10m"
    },
    "analysis": {
      "analyzer": {
        "ngram3_analyzer": {
          "tokenizer": "ngram3_tokenizer",
          "filter": [
            "lowercase"
          ]
        }
      },
      "tokenizer": {
        "ngram3_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 20,
          "token_chars": [
            "letter",
            "digit",
            "symbol",
            "custom"
          ],
          "custom_token_chars": "/"
        }
      }
    }
  },
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "name": {
        "type": "keyword",
        "fields": {
          "partial": {
            "type": "text",
            "analyzer": "ngram3_analyzer",
            "search_analyzer": "keyword"
          },
          "text": {
            "type": "text"
          }
        }
      },
      "value": {
        "type": "integer"
      }
    }
  }
}

这对rest客户端和java API都有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65790904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档