python - 弹性搜索:部分搜索无法正常工作
问题描述
部分搜索不适用于多个字段。
数据:-“ Sales inquiries generated
”。
{
"query_string": {
"fields": ["name", "title", "description", "subject"],
"query": search_data+"*"
}
}
案例1:当我将搜索数据作为“inquiri”传递时,它工作正常,但是当我将搜索数据作为“inquirie”传递时,它不起作用。
案例2:当我将搜索数据作为“销售”传递时,它工作正常,但是当我将搜索数据作为“销售”传递时,它不起作用。
案例3:当我将搜索数据作为“生成”传递时,它工作正常,但是当我将搜索数据作为“生成”传递时,它不起作用。
我以这种方式定义了我的领域。
text_analyzer = analyzer("text_analyzer", tokenizer="standard", filter=["lowercase", "stop", "snowball"])
name = Text(analyzer=text_analyzer, fields={"raw": Keyword()})
title = Text(analyzer=text_analyzer, fields={"raw": Keyword()})
subject = Text(analyzer=text_analyzer, fields={"raw": Keyword()})
我的代码有什么问题?任何帮助将非常感激!提前致谢。
解决方案
这是由于使用了snowball
词干的标记过滤器而发生的,请参阅官方雪球文档以获取更多信息。
我使用您的设置创建相同的分析器以查看为您的文本生成的标记,因为在索引标记与搜索词标记匹配时发生最终搜索。
ES 提供了不错的 REST api,您可以轻松地重现该问题:
使用您的设置创建索引
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"filter": [
"lowercase",
"snowball",
"stop"
]
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
创建索引后,您可以使用分析 API查看为您的文本生成的标记。
POST http://{{hostname}}:{{port}}/{{index-name}}/_analyze
{
"analyzer": "my_analyzer",
"text": "Sales inquiries generated"
}
{
"tokens": [
{
"token": "sale",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "inquiri",
"start_offset": 6,
"end_offset": 15,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "generat",
"start_offset": 16,
"end_offset": 25,
"type": "<ALPHANUM>",
"position": 2
}
]
}
您可以看到与您的搜索查询匹配的所有标记都是相同的,因此您将获得其他搜索词的结果,这意味着在查询而不是原始时,您正在使用文本字段的关键字部分
推荐阅读
- redis - 为什么要使用etcd?我可以使用redis来实现配置管理/服务发现等吗?
- php - 如果 REQUEST_URI 以特定路径开头,.htaccess 重定向并重写 url
- python - 带有日期列表的 Pyspark DF(使用 PANDAS)从今天开始 BACK 1 年
- javascript - 导入 npm 模块作为源代码
- content-management-system - AEM 6.4 覆盖 /libs 下的内部区域组件/文件
- c++ - 在互斥体范围之外读取 volatile 变量,而不是 std::atomic
- python-3.x - 如何重复注册 aws cognito [解决]
- botframework - Microsoft Teams Bot 的可点击文本
- ionic3 - Ionic 3 动画生成器
- php - PHPUnit 7.2 和 Codeception 2.4 不兼容