elasticsearch - Elasticsearch 查询以查找字符串字段的完全匹配(无需分析)
问题描述
我们将类别存储在索引中,这是类别的映射
"name": {
"type": "string",
"analyzer": "autocomplete",
"search_analyzer": "standard"
}
现在,我们想对该字段进行精确搜索,这是我们正在尝试的查询
{
"from": "0",
"size": "15",
"query": {
"filtered": {
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "a",
"type": "cross_fields",
"fields": [
"field1^20",
"filed1^12"
]
}
},
{
"match": {
"category.name": "Arts and Culture"
}
}
]
}
},
"filter": {
"bool": {
"must": [
{
"terms": {
"address_type": [
"val1",
"val2"
]
}
},
{
"terms": {
"status": ["Active","Inactive"]
}
}
]
}
}
}
}
}
但它不完全匹配,我不想更改映射,因为我们也想在其他一些用例中进行部分搜索。
我只想对查询中的一些修改进行完全匹配,是否有可能或有任何解决方法?
谢谢您的帮助。
解决方案
映射会影响数据的存储方式以及查询该字段的方式。您的类别字段(名为name)字段配置为用于自动完成而不是用于完全匹配搜索。因此,您必须更改映射以支持精确匹配搜索。
但是,您可以在不更改当前字段的情况下执行此操作,只需通过将字段转换为多字段并添加支持精确匹配查询的字段来添加附加字段。映射片段:
“名称”:{“类型”:“字符串”,“分析器”:“自动完成”,“搜索分析器”:“标准”,“字段”:{“原始”:{“类型”“字符串”,“索引”: “未分析” } } } }
注意:我注意到您使用的是旧版本的 Elasticsearch(类型“字符串”已替换为类型“文本”(用于全文搜索)和“关键字”(用于精确匹配搜索)。我试图提出使用适用于旧版本 Elasticsearch 的映射并希望它有效。如果不是,您需要提供您正在使用的 Elasticsearch 版本。
修复映射后,您需要确保该字段也已填充。您可以通过执行以下请求来重新索引所有内容:
POST <your_index_name>/_update_by_query
在您的查询中,您需要按如下方式进行搜索(精确匹配):
"match": {
"category.name.raw": "Arts and Culture"
}
对于部分搜索,您将继续使用category.name
-field (不带后缀raw)
推荐阅读
- django - 如何在 django 管理主页中添加搜索栏
- django - 如何使用 HTML/Javascript 防止 XSS 攻击?
- c++ - 在指针地址中隐藏数据有什么好处
- java - 使用 CRFBiasedClassifier
- android - BottomNavigation 视图中的波纹效果
- azure-data-factory - HDInsightOndemand 链接服务无法创建集群
- python - 如何从python中的POS_TAG仅获取部分语音
- matlab - 使用 Matlab 神经工具箱求解差分方程
- annotations - SAPUI5 注释结构无法读取属性“IndexOf”未定义
- python - Python - 在 Pandas Dataframe 中找到最长的连续运行