目录

要通过API查看当前Elasticsearch支持的分词器,你可以使用以下方法:

  1. 使用_cat/plugins端点来查看所有已安装的插件,包括分析器插件。

    GET /_cat/plugins?v
    
  2. 如果你想要查看特定索引的分析器设置,可以使用_settings端点。这将显示索引级别的分析器配置,包括自定义分析器(如果有的话)。

    GET /your_index/_settings/analysis
    
  3. 使用_cluster/settings端点来查看集群级别的分析器设置,这包括了集群级别的默认分析器。

    GET /_cluster/settings?include_defaults=true&filter_path=index.analysis.*
    
  4. 使用_analyze端点来测试文档将如何被特定分析器处理。这可以帮助你理解分析器的行为,但不会列出所有可用的分析器。

    POST /your_index/_analyze
    {
      "analyzer": "standard",
      "text": "This is a test text to analyze."
    }
    
  5. 官方文档列出了所有内置的分析器。你可以访问Elasticsearch官方文档分析器部分获取详细信息。

这里我采用的是standard作为分词器

2. 分词器种类

2.1 standard分词器

例如,使用 standard 分词器分析以下文本:

transimission control protocol is a transport layer protocol

[transimission, control, protocol, is, a, transport, layer, protocol]

这个分词器对于英文文本来说效果较好,但对于中文文本,它可能会将其拆分成单个字符,而不是按照词语进行分词。对于中文和其他需要特殊处理的语言,可能需要使用其他更适合的分词器,如 IK 分词器。

比如这里

···
PUT /test_index
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "standard"
      }
    }
  }
}
···

然后检索请求
{
  "query": {
    "match": {
      "content": "狄宇宙"
    }
  }
}

{
"took": 2,
"timed_out": false,
"_ shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1.5843642,
"hits": [
{
"_ index": "test_index",
"_ type": "doc",
"
id": "q2HAOZABsJcH3FefOZbh",
"score": 1.5843642,
"
source": {
"content": "狄宇宙"
}
},
{
"index": "test_index",
"type": " doc",
"id": "qmHAOZABsJcH3FefLpYX",
"
score": 0.603535,
"source": {
"content": "狄宇奕"
}
},
{
"
index": "test_index",
"
type": "doc",
"
id": "qWHAOZABsJcH3FefCpbs",
"score": 0.13353139,
"
source": {
"content": "狄仁杰"
}
}
]
}
}

当对text类型的字段进行排序时,Elasticsearch会使用该字段的keyword子字段(如果存在),因为text类型的字段本身是经过分词的,不适合排序。如果你的content字段没有定义keyword子字段,Elasticsearch将尝试使用分词后的单个词元进行排序,这可能不是你想要的排序方式。

还可以将检索结果按照content排序返回

PUT /my_index
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

POST /my_index/_search
{
  "query": {
    "match": {
      "content": "狄宇宙"
    }
  },
  "sort": [
    {
      "content.keyword": {
        "order": "desc"
      }
    }
  ]
}

  1. 选择合适的分词器:根据你的数据特点和查询需求,选择合适的分词器。例如,对于中文数据,可以使用ik分词器或ansj分词器等。
  2. 自定义分词器:如果内置的分词器不满足需求,可以自定义分词器。通过调整分词器的配置,可以更好地匹配你的数据特性。
  3. 调整索引和搜索时的分词器:确保索引时使用的分词器与搜索时使用的分词器一致。如果不一致,可能会导致查询时无法找到索引中的词。
  4. 使用**match**查询:match查询会对输入的文本进行分词,然后与索引中的词进行匹配。这可以提高查询的准确性。
  5. 使用**multi_match**查询:如果需要在多个字段上执行查询,可以使用multi_match查询。它允许你指定一个查询文本,并在多个字段上进行搜索。
  6. 优化查询语句:检查你的查询语句是否正确。例如,使用term查询时,它不会进行分词,而是直接匹配索引中的词。如果期望匹配的是经过分词后的词,应该使用match查询。
  7. 使用**ngram或edge_ngram**分词器:这些分词器可以生成n-gram,有助于匹配前缀或部分词的查询。
  8. 分析和调试:使用_analyzer API测试你的分词器,查看输入文本是如何被分词的。这有助于你理解为什么某些词没有被匹配到。
  9. 考虑使用**fuzzy**查询:如果查询词与索引中的词有轻微的差异,可以使用fuzzy查询来匹配近似的词。
  10. 更新索引:如果问题是由于之前的数据使用不同的分词器索引导致的,可能需要重新索引数据,以确保使用新的分词器。

通过上述方法,你可以提高Elasticsearch查询的准确性和性能。如果问题依然存在,建议深入分析具体的分词器配置和查询语句,以找到最合适的解决方案。