Elasticsearch - 停止分析器不允许数字
Elasticsearch - Stop analyzer doesn't allow number
我正在尝试使用 elasticsearch 6.3.0 构建一个搜索实用程序,可以在其中搜索数据库中的任何术语。我已经应用 Stop Analyzer 来排除一些通用词。但是,在让该分析器系统停止给我提供数字术语后。
例如,如果我搜索 news24,它会删除 24 并仅在所有记录中搜索 "news" 字词。不确定为什么。
下面是我正在使用的查询
{
"from": 0,
"size": 10,
"explain": false,
"stored_fields": [
"_source"
],
"query": {
"function_score": {
"query": {
"multi_match": {
"query": "news24",
"analyzer": "stop",
"fields": [
"title",
"keywords",
"url"
]
}
},
"functions": [
{
"script_score": {
"script": "( (doc['isSponsered'].value == 'y') ? 100 : 0 )"
}
},
{
"script_score": {
"script": "doc['linksCount'].value"
}
}
],
"score_mode": "sum",
"boost_mode": "sum"
}
},
"script_fields": {
"custom_score": {
"script": {
"lang": "painless",
"source": "params._source.linksArray"
}
}
},
"highlight": {
"pre_tags": [
""
],
"post_tags": [
"<\/span>"
],
"fields": {
"title": {
"type": "plain"
},
"keywords": {
"type": "plain"
},
"description": {
"type": "plain"
},
"url": {
"type": "plain"
}
}
}
}
这是因为 stop analyzer
只是 Simple Analyzer which makes use of Lowercase Tokenizer 的扩展,如果它遇到不是 letter
的字符(当然也会小写所有条款)。
所以基本上,如果你有类似 news24
的东西,它会在遇到 2
时将其分解为 news
。
这是 stop analyzer
的默认行为。如果您打算使用停用词并且仍然希望在图片中保留数字,那么您将需要创建一个自定义分析器,如下所示:
映射:
POST sometestindex
{
"settings":{
"analysis":{
"analyzer":{
"my_english_analyzer":{
"type":"standard",
"stopwords":"_english_"
}
}
}
}
}
它的作用 它利用了 Standard Analyzer
,它在内部使用 Standard Tokenizer 并忽略停用词。
要测试的分析查询
POST sometestindex/_analyze
{
"analyzer": "my_english_analyzer",
"text": "the name of the channel is news24"
}
查询结果
{
"tokens": [
{
"token": "name",
"start_offset": 4,
"end_offset": 8,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "channel",
"start_offset": 16,
"end_offset": 23,
"type": "<ALPHANUM>",
"position": 4
},
{
"token": "news24",
"start_offset": 27,
"end_offset": 33,
"type": "<ALPHANUM>",
"position": 6
}
]
}
您可以在上面的令牌中看到,news24
被保留为令牌。
希望对您有所帮助!
我正在尝试使用 elasticsearch 6.3.0 构建一个搜索实用程序,可以在其中搜索数据库中的任何术语。我已经应用 Stop Analyzer 来排除一些通用词。但是,在让该分析器系统停止给我提供数字术语后。
例如,如果我搜索 news24,它会删除 24 并仅在所有记录中搜索 "news" 字词。不确定为什么。
下面是我正在使用的查询
{
"from": 0,
"size": 10,
"explain": false,
"stored_fields": [
"_source"
],
"query": {
"function_score": {
"query": {
"multi_match": {
"query": "news24",
"analyzer": "stop",
"fields": [
"title",
"keywords",
"url"
]
}
},
"functions": [
{
"script_score": {
"script": "( (doc['isSponsered'].value == 'y') ? 100 : 0 )"
}
},
{
"script_score": {
"script": "doc['linksCount'].value"
}
}
],
"score_mode": "sum",
"boost_mode": "sum"
}
},
"script_fields": {
"custom_score": {
"script": {
"lang": "painless",
"source": "params._source.linksArray"
}
}
},
"highlight": {
"pre_tags": [
""
],
"post_tags": [
"<\/span>"
],
"fields": {
"title": {
"type": "plain"
},
"keywords": {
"type": "plain"
},
"description": {
"type": "plain"
},
"url": {
"type": "plain"
}
}
}
}
这是因为 stop analyzer
只是 Simple Analyzer which makes use of Lowercase Tokenizer 的扩展,如果它遇到不是 letter
的字符(当然也会小写所有条款)。
所以基本上,如果你有类似 news24
的东西,它会在遇到 2
时将其分解为 news
。
这是 stop analyzer
的默认行为。如果您打算使用停用词并且仍然希望在图片中保留数字,那么您将需要创建一个自定义分析器,如下所示:
映射:
POST sometestindex
{
"settings":{
"analysis":{
"analyzer":{
"my_english_analyzer":{
"type":"standard",
"stopwords":"_english_"
}
}
}
}
}
它的作用 它利用了 Standard Analyzer
,它在内部使用 Standard Tokenizer 并忽略停用词。
要测试的分析查询
POST sometestindex/_analyze
{
"analyzer": "my_english_analyzer",
"text": "the name of the channel is news24"
}
查询结果
{
"tokens": [
{
"token": "name",
"start_offset": 4,
"end_offset": 8,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "channel",
"start_offset": 16,
"end_offset": 23,
"type": "<ALPHANUM>",
"position": 4
},
{
"token": "news24",
"start_offset": 27,
"end_offset": 33,
"type": "<ALPHANUM>",
"position": 6
}
]
}
您可以在上面的令牌中看到,news24
被保留为令牌。
希望对您有所帮助!