【发布时间】:2020-06-28 03:21:28
【问题描述】:
我有下面的映射,它工作正常
{
"settings": {
"index": {
"number_of_shards": "5",
"number_of_replicas": "0",
"analysis": {
"filter": {
"stemmer_plural_portugues": {
"name": "minimal_portuguese",
"stopwords" : ["http", "https", "ftp", "www"],
"type": "stemmer"
},
"synonym_filter": {
"type": "synonym",
"lenient": true,
"synonyms_path": "analysis/synonym.txt",
"updateable" : true
},
"shingle_filter": {
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 3
}
},
"analyzer": {
"analyzer_customizado": {
"filter": [
"lowercase",
"stemmer_plural_portugues",
"asciifolding",
"synonym_filter",
"shingle_filter"
],
"tokenizer": "lowercase"
}
}
}
}
},
"mappings": {
"properties": {
"id": {
"type": "long"
},
"data": {
"type": "date"
},
"quebrado": {
"type": "byte"
},
"pgrk": {
"type": "integer"
},
"url_length": {
"type": "integer"
},
"title": {
"analyzer": "analyzer_customizado",
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
},
"description": {
"analyzer": "analyzer_customizado",
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
},
"url": {
"analyzer": "analyzer_customizado",
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
}
}
}
}
我在下面插入文档
{
"title": "rocket 1960",
"description": "space",
"url": "www.nasa.com"
}
如果我使用AND运算符执行下面的查询,它会正常找到文档,因为搜索到的所有单词都存在于文档中。
{
"from": 0,
"size": 10,
"query": {
"multi_match": {
"query": "space nasa rocket",
"type": "cross_fields",
"fields": [
"title",
"description",
"url"
],
"operator": "and"
}
}
}
但如果我将它也放入搜索“1960”,因为下面的查询不会返回任何内容
{
"from": 0,
"size": 10,
"query": {
"multi_match": {
"query": "1960 space nasa rocket",
"type": "cross_fields",
"fields": [
"title",
"description",
"url"
],
"operator": "and"
}
}
}
我发现我的“小写”标记器不会生成数字标记。所以我将我的标记器更改为“标准”并生成 1960 数字标记。
但是查询没有找到任何东西,因为具有链接www.nasa.com 的URL 字段不再生成令牌“www nasa com”,生成的令牌是整个链接www.nasa.com。
只有当我输入完整的 URL www.nasa.com 时,查询才有效,如下所示
{
"from": 0,
"size": 10,
"query": {
"multi_match": {
"query": "1960 space www.nasa.com rocket",
"type": "cross_fields",
"fields": [
"title",
"description",
"url"
],
"operator": "and"
}
}
}
如果我仅为 URL 字段生成另一个“小写”标记器,则链接 www.nasa.com 会再次生成单独的标记“www nasa com”
但我在下面的查询没有找到任何内容,因为 URL 字段的标记器与其他字段的标题和描述不同。下面的查询仅在我使用 OR 运算符时有效,但我需要 AND 运算符,
{
"from": 0,
"size": 10,
"query": {
"multi_match": {
"query": "1960 space nasa rocket",
"type": "cross_fields",
"fields": [
"title",
"description",
"url"
],
"operator": "and"
}
}
}
我无法在映射中使用 Ngram,因为我使用“短语建议器”,并且当我使用 Ngram 时,生成的建议中包含数百个生成不准确的标记的建议。
有没有人知道我的映射能够在我的“标题和描述”字段中生成数字标记的任何解决方案,但是我的 URL 字段将继续将网站链接分成几个标记“www nasa com”而不是链接是完整的“www .nasa.com”,并且我的查询作为 AND 运算符同时搜索所有字段。
【问题讨论】:
-
你能添加你的 synonyms.txt 吗?我觉得这就是问题所在。否则一切正常
-
@Gibbs 我的同义词工作正常
-
无法重现。这是我看到的唯一区别。您是说同义词文件中的内容不会影响此查询。
-
@gibbs 我刚刚测试了从映射中删除同义词,但没有任何改变,同样的问题仍在继续
标签: elasticsearch elasticsearch-5