首页 > 解决方案 > 如何在弹性搜索文本搜索中匹配部分单词

问题描述

我的弹性搜索中有一个字段name,其值为Single V

现在,如果我用Sor的值搜索它Sing,我不会得到任何结果,但如果我输入一个完整的值Single,那么我会得到结果Single V,我正在使用的查询如下:-

{
  "query": {
    "match": {
      "name": "singl"
    }
  },
  "sort": []
}

这没有给我任何结果,我是否需要更改名称或分析器的映射/设置?

编辑:-

我正在尝试使用以下映射/设置创建以下索引

PUT my_cars
{
  "settings": {
    "analysis": {
      "normalizer": {
        "sortable": {
          "filter": ["lowercase"]
        }
      },
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        },
        "tokenizer": {
          "my_tokenizer": {
            "type": "ngram",
            "min_gram": 1,
            "max_gram": 36,
            "token_chars": [
              "letter"
            ]
          }
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "my_analyzer",
        "fields": {
          "keyword": {
            "type": "keyword",
            "normalizer": "sortable"
          }
        }
      }
    }
  }
}

但我收到以下错误

{
  "error" : {
    "root_cause" : [
      {
        "type" : "illegal_argument_exception",
        "reason" : "analyzer [tokenizer] must specify either an analyzer type, or a tokenizer"
      }
    ],
    "type" : "illegal_argument_exception",
    "reason" : "analyzer [tokenizer] must specify either an analyzer type, or a tokenizer"
  },
  "status" : 400
}

标签: elasticsearch

解决方案


如果没有指定分析器, Elasticsearch 默认使用标准分析器作为字段。text这将标记"Single V""single"and "v"。因此,您得到的是其他条款的结果,"Single"而不是其他条款的结果。

如果要进行部分搜索,可以使用edge n-gram tokenizer通配符查询

Edge n-gram 标记器的映射将是

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 6,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    },
    "max_ngram_diff": 10
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}

更新 1:

}在上面给出的索引映射中,缺少一个括号。修改您的索引映射,如下所示

{
  "settings": {
    "analysis": {
      "normalizer": {
        "sortable": {
          "filter": [
            "lowercase"
          ]
        }
      },
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }                                 
      },                                    // note this
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 1,
          "max_gram": 36,
          "token_chars": [
            "letter"
          ]
        }
      }
    },
    "max_ngram_diff": 50
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "my_analyzer",
        "fields": {
          "keyword": {
            "type": "keyword",
            "normalizer": "sortable"
          }
        }
      }
    }
  }
}

推荐阅读