ElasticSearch查询无结果:Content.Text词干分析配置问题求助
问题排查与解决方案
你遇到的核心问题是索引映射配置存在语法错误,导致Content.Text字段并没有应用你定义的my_analyzer分析器,进而使得词干化后的搜索关键词无法匹配到文档。
1. 定位映射中的错误
你提供的创建索引的curl命令里,Content.Text字段的映射写法存在明显语法错误:
"Text": "_all": { "type": "text", "analyzer": "my_analyzer", "search_analyzer": "my_analyzer" }
这里多写了一个错误的"_all"键,属于JSON结构错误。Elasticsearch解析时会忽略这个无效配置,导致Text字段默认使用标准分析器,而非你自定义的my_analyzer——这就是为什么你验证分析器时indexing能被处理成index,但实际索引文档时却没有生效。
2. 修正索引创建命令
下面是修复后的完整curl命令,修正了映射的语法问题:
curl -X PUT "localhost:9200/myindex?pretty" -H "Content-Type: application/json" -d'{ "settings": { "analysis": { "analyzer": { "my_analyzer": { "tokenizer": "standard", "filter": ["lowercase", "my_stemmer"] } }, "filter": { "my_stemmer": { "type": "stemmer", "name": "english" } } } }, "mappings": { "properties": { "DocumentName": { "type": "text" }, "DocumentId": { "type": "keyword" }, "Content": { "properties": { "PageNo": { "type": "integer" }, "Text": { "type": "text", "analyzer": "my_analyzer", "search_analyzer": "my_analyzer" } } } } } }'
3. 重新索引文档
由于之前的索引映射配置错误,已上传的文档没有按照正确的分析器处理,需要执行以下步骤:
- 删除原索引(如果无需保留旧数据):
curl -X DELETE "localhost:9200/myindex?pretty" - 使用修正后的命令重新创建索引
- 重新上传你的JSON文档到索引中
4. 验证搜索结果
完成上述操作后,再运行你的Python搜索代码:
import requests from elasticsearch import Elasticsearch res = requests.get('http://localhost:9200') es = Elasticsearch([{'host': 'localhost', 'port': '9200'}]) res = es.search(index='myindex', body={"query": {"match": {"Content.Text": "index"}}}) print(res['hits']['hits'])
此时应该能正确返回包含indexing的文档。
你也可以通过以下命令直接验证Content.Text字段的分析效果,确保词干化规则生效:
curl -X GET "localhost:9200/myindex/_analyze?pretty" -H "Content-Type: application/json" -d'{ "field": "Content.Text", "text": "indexing" }'
内容的提问来源于stack exchange,提问作者Nayana Madhu
相关产品推荐
相关产品推荐

