elasticsearch - 在弹性搜索中过滤匹配单个字符的结果
问题描述
在我的弹性搜索结果中,即使匹配单个字符也会给出结果。当我们看到个位数的结果时,结果看起来很奇怪。
无论如何通过DSL查询过滤掉匹配单个数字/字符的结果。
当前查询:
GET /attachment_index/_search
{
"_source": [
"user_email_id",
"file_content_id",
"file_name",
"non_indexed_meta_data"
],
"query": {
"bool": {
"must": [
{
"has_child": {
"type": "user_email_id",
"query": {
"match": {
"user_email_id": "test@user.com"
}
},
"inner_hits": {}
}
},
{
"match": {
"attachment.content": {
"query": "mark twain 3",
"analyzer": "english",
"operator": "or"
}
}
}
]
}
},
"highlight": {
"order": "score",
"pre_tags": [
"<strong>"
],
"post_tags": [
"</strong>"
],
"fields": {
"attachment.content": {}
}
},
"size": 100
}
它给出了我不想要的 3 个结果匹配。在馈送到弹性搜索之前对长度进行过滤而不进行预处理有什么想法吗?
解决方案
可以使用自定义分析器根据长度进行过滤。Elasticsearch 文档包含一个如何重建英文分析器的示例,以便我们可以在那里添加最小长度过滤器,例如
PUT /attachment_index
{
"settings": {
"analysis": {
"filter": {
"english_stop": {
"type": "stop",
"stopwords": "_english_"
},
"english_stemmer": {
"type": "stemmer",
"language": "english"
},
"english_possessive_stemmer": {
"type": "stemmer",
"language": "possessive_english"
},
"length": {
"type": "length",
"min": 2
}
},
"analyzer": {
"length_english": {
"tokenizer": "standard",
"filter": [
"english_possessive_stemmer",
"lowercase",
"english_stop",
"english_stemmer",
"length"
]
}
}
}
}
}
试试这个:
GET attachment_index/_analyze
{
"analyzer": "length_english",
"text": "mark twain 3"
}
返回
{
"tokens" : [
{
"token" : "mark",
"start_offset" : 0,
"end_offset" : 4,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "twain",
"start_offset" : 5,
"end_offset" : 10,
"type" : "<ALPHANUM>",
"position" : 1
}
]
}
所以3
根据需要过滤掉了。length_english
可以使用分析器代替english
匹配查询。
推荐阅读
- r - R:将每日数据转换为月平均值
- javascript - 将数组从 PHP 函数传递到 Javascript
- azure-cognitive-search - Azure 搜索 API - 搜索筛选器语法
- javascript - 如何获取具有地理坐标的小多边形的面积
- java - NullPointerException:尝试在空对象引用上调用接口方法“int java.util.List.size()”
- node.js - 如何在 JS 中将 64 位数字字符串转换为 int
- php - 如何在 Prestashop 1.7 中获得具有属性值但没有属性组的“产品名称”?
- c# - 在 C# 中创建包含文件路径的命令行
- go - 尝试编写自定义规则
- javascript - 内插值应用于所有 ngfor 元素的跨度文本内容