【问题标题】:How to search with keyword analyzer?如何使用关键字分析器进行搜索?
【发布时间】:2015-03-04 17:29:53
【问题描述】:

我将关键字分析器作为默认分析器,如下所示:

{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "default": {
            "type": "keyword"
}}}}}}

```

但是现在我什么都搜索不到。例如:

{
  "query": {
    "query_string": {
      "query": "cast"
}}}

尽管“cast”是索引文档中的一个常见值,但给我 0 个结果。 (http://gist.github.com/baelter/b0720a52ee5a27e27d3a)

顺便说一句,搜索“*”可以正常工作。

我的映射中只有明确的默认值:

{
  "oceanography_point": {
    "_all" : {
      "enabled" : true
    },
    "properties" : {}
 }
}

索引的行为就像 _all 中不包含任何字段一样,因为 field:value 查询工作正常。

我是否误用了关键字分析器?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    使用关键字分析器,您只能进行精确的字符串匹配。 让我们假设您使用了关键字分析器并且没有使用过滤器。 在这种情况下,对于索引为 "Cast away in forest" 的字符串,搜索 "cast" 或 "away" 都不起作用。你需要做一个精确的“Cast away in forest”字符串来匹配它。 (假设没有使用小写过滤器,你也需要给出正确的大小写)

    更好的方法是使用multi fields 将一个副本声明为已分析的关键字,而将另一个副本声明为正常。 您可以在其中一个字段上进行搜索并在另一个字段上进行汇总。

    【讨论】:

    • 是的,我知道还有其他实现文本搜索的方法,但是在这种情况下“cast”是完全匹配的。
    • 你能粘贴*的结果吗
    • 粘贴不多,我得到一个 hits 数组,其中包含我的后备 couchdb 数据库中的所有文档。
    • 我想看看原始数据的样子。这就是全部
    • 在架构中,您是否禁用了 _all 或将“include_in_all”用于收集为 false ?
    【解决方案2】:

    好吧,经过大约 15 小时的反复试验,我可以得出结论,这适用于搜索:

    {
      "settings": {
        "index": {
          "analysis": {
            "tokenizer": {
              "default": {
                "type": "keyword"
    }}}}}}
    

    这怎么会破坏分面,所以我最终改用了动态模板:

    "dynamic_templates" : [
      {
        "strings_not_analyzed" : {
          "match" : "*",
          "match_mapping_type" : "string",
          "mapping" : {
            "type" : "string",
            "index" : "not_analyzed"
          }
        }
      }
    ],
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      相关资源
      最近更新 更多