elasticsearch - 无论搜索文本中的空格如何,Elasticsearch 查询都可以获取结果
问题描述
我正在尝试从字段名称匹配的 Elasticsearch 中获取数据。我有以下两条记录
{
"_index": "sam_index",
"_type": "doc",
"_id": "key",
"_version": 1,
"_score": 2,
"_source": {
"name": "Sample Name"
}
}
和
{
"_index": "sam_index",
"_type": "doc",
"_id": "key1",
"_version": 1,
"_score": 2,
"_source": {
"name": "Sample Name"
}
}
当我尝试使用sam、sample、Sa 等文本进行搜索时,我可以使用 match_phrase_prefix 查询来获取这两条记录。我尝试使用 match_phrase_prefix 的查询是
GET sam_index/doc/_search
{
"query": {
"match_phrase_prefix" : {
"name": "sample"
}
}
}
当我尝试使用字符串samplen进行搜索时,我无法获取记录。无论文本之间的空格如何,我都需要搜索并获得结果。如何在 Elasticsearch 中实现这一点?
解决方案
首先,您需要了解 Elasticsearch 是如何工作的,以及为什么它会给出结果而不给出结果。
ES 处理令牌匹配,您在 ES 中索引的文档经过分析过程,并创建并存储从该过程生成的令牌到用于搜索的倒排索引。
现在,当您进行查询时,该查询还会生成搜索标记,这些标记可以是搜索查询中的术语查询,也可以是基于搜索字段上定义的分析器的标记(如果是匹配查询)。因此,了解搜索查询的内部结构非常重要。
此外,了解索引的映射非常重要,ES 默认在文本字段上使用标准分析器。
您可以使用Explain API 了解查询的内部结构,例如您的搜索查询生成了哪些搜索标记、文档如何与之匹配以及计算得分的依据。
在您的情况下,我将名称字段创建为文本,它使用在 Elasticsearch 中忽略空格中解释的单词连接分析器,并且我能够获得sample name
搜索时包含的文档samplen
。
让我们知道您是否也想实现相同的目标以及它是否可以解决您的问题。
推荐阅读
- javascript - 在数组中添加多个值
- audio - 多个文件音频不同步的ffmpeg concat
- php - 无法更改 laravel 数据库
- autohotkey - 用于保存对话框的 AHK:导航到桌面并跳转到字段文件名
- android - Kotlin 中 TextInput 的 SetOnKeyListener 不起作用
- javascript - KeysPressed 是位掩码的。如何取消位掩码并使其成为关键状态的结构?(Javascript)
- mysql - HikariCP 和 mysql 线程连接
- php - Laravel 深度关系查询
- reactjs - 将动作从子组件提取到父组件
- java - java.lang.IllegalArgumentException:给定的字符串值:{“过去 7 天”:19 } 无法转换为 Json 对象