python - elasticsearch如何找到具有精确单词匹配的文档
问题描述
我在 ES 中有一些数据。例如
{
result: [{
id: 1,
full_text: some dummy text
}, {
id: 2,
full_text: i read my book sometimes
}, {
id: 3,
full_text: somewhere in time is one of the greatest albums of all time
}]
}
我必须创建一些查询来返回与全文字段中的单词完全匹配的所有文档。例如,如果我想在全文中获取所有带有单词“some”的文档,它必须只返回第一个没有模糊搜索的文档,并且不必考虑诸如“something,somewhere”之类的单词。我尝试使用匹配项,但不返回完全匹配的单词。我也尝试使用正则表达式,但无法创建正确的。例如,这个返回什么都没有,就像“full_text”中没有带有“some”一词的文档一样
{
"query": {
"regexp": {
"summary_text": {
"value": "\bsome\b"
}
}
}
}
有人知道这种搜索的正确查询或正则表达式吗?
解决方案
如果您查看映射,“analyzer”:“english” 用于字段 full_text
英语分析器默认提供词干提取,即它将标记分解为词根。为定义/定义创建的标记是定义,因此定义、定义、定义所有三个都是等价的。
{
"mappings": {
"agencies": {
"full_text": {
"type": "text",
"fields": {
"reverse": {
"type": "text",
"analyzer": "reverse"
},
"trigram": {
"type": "text",
"analyzer": "trigram"
}
},
"copy_to": [
"light_stem",
"shingled"
],
"analyzer": "english"
}
}
}
}
您需要更新您的映射并创建一个文本类型的子字段,而无需任何分析器。
如果您将某些子字段定义为反向并复制到 light_stem 和 shingled。您的映射中不存在它们的定义,因此无法在我的最后进行测试。您也可以尝试对这些进行匹配查询。full_text.reverse:“定义”
copy_to 用于将多个字段的值复制到一个地方。您的匹配查询将对这些起作用,但如果任何其他字段(带有 copy_to)具有单词定义但 full_text 没有它,仍然会返回该文档。
推荐阅读
- javascript - 我可以使一个变量对视图控制器文件中的每个页面通用吗?
- ruby-on-rails - Rails - 自联接
- node.js - Gcloud计算api createVM不创建公共IP
- python - 如何使用 murmurhash3 散列整数和字符串输入
- javascript - 如何在fabric.js画布上禁用多选?
- java - 使用javac编译Java文件无法引用同一目录下的其他文件
- ios - 设备未收到 Firebase iOS 通知
- python - 如何使用python代码获取python项目的git commit hash?
- adb - 使用带有 M1 CPU 的 Mac 更新 Google Glass 固件时出错:快速启动:无法获取启动分区大小
- python - 使用 pandas 重塑交易订单的数据集