ElasticSearch 在单词中使用连字符进行搜索
ElasticSearch searching with hyphen inside a word
我想寻求帮助。我想在标题和内容中搜索一个词。这是结构
'body' => array(
'mappings' => array(
'myindex' => array(
'_source' => array(
'enabled' => true
),
'properties' => array(
'Title' => array(
'type' => 'string',
'fields'=> array(
'raw' => array(
'type' => 'string',
'index' => 'not_analyzed'
)
)
),
'Content' => array(
'type' => 'string'
),
'Image' => array(
type' => 'string',
'analyzer' => 'standard'
)
)
)
)
)
查询字符串如下所示,我希望在“15-game”这样的文本中搜索“15-g”:
"query" : {
"query_string": {
"query": "*15-g*",
"fields": [ "Title", "Content" ]
}
}
如果我重复这个问题,请接受我的道歉,但我无法找出发生了什么以及为什么它没有 return 任何结果。
我已经看过了:
ElasticSearch - Searching with hyphens in name
ElasticSearch - Searching with hyphens in name
但我不能和我一起工作。
真正有趣的是,如果我搜索“15 - g”(15space-spaceg) 它 return 结果。
在此先感谢您!
也将 .raw
字段添加到您的 Content
并在 .raw
字段上进行搜索:
{
"query": {
"query_string": {
"query": "*15-g*",
"fields": [
"Title.raw",
"Content.raw"
]
}
}
}
任何你想要搜索的文本中有 space 并且你想要 space要匹配您的字段,需要对其进行转义(使用 \
)。此外,任何时候你有大写字母和通配符并且你想像这样与 .raw
字段匹配,你需要将 lowercase_expanded_terms
设置为 false
,因为默认情况下该设置为 [=19] =],它将小写搜索字符串(它将搜索 laptop - black
):
{
"query": {
"query_string": {
"query": "*Laptop\ -\ Black*",
"lowercase_expanded_terms": false,
"fields": [
"Title.raw",
"Content.raw"
]
}
}
}
在 elasticsearch 5 中,您可以使用过滤器设置来定义自定义分析器。
这是示例代码:
PUT test1
{
"settings" : {
"analysis" : {
"analyzer" : {
"myAnalyzer" : {
"type" : "custom",
"tokenizer" : "whitespace",
"filter" : [ "dont_split_on_numerics" ]
}
},
"filter" : {
"dont_split_on_numerics" : {
"type" : "word_delimiter",
"preserve_original": true,
"generate_number_parts" : false
}
}
}
},
"mappings": {
"type_one": {
"properties": {
"title": {
"type": "text",
"analyzer": "standard"
}
}
},
"type_two": {
"properties": {
"raw": {
"type": "text",
"analyzer": "myAnalyzer"
}
}
}
}
}
请知道我设置了
"preserve_original": true
"generate_number_parts"
这样字符串“2-345-6789”将保持原样。 Dash 是 elasticsearch 中的保留字。如果没有上述设置,标准分词器将生成“2”、“345”和“6789”。所以,现在您可以使用 "wildcard" 搜索即。
"5-67"
得到结果。
POST test1/type_two/1
{
"raw": "2-345-6789"
}
GET test1/type_two/_search
{
"query": {
"wildcard": {
"raw": "*5-67*"
}
}
}
我想寻求帮助。我想在标题和内容中搜索一个词。这是结构
'body' => array(
'mappings' => array(
'myindex' => array(
'_source' => array(
'enabled' => true
),
'properties' => array(
'Title' => array(
'type' => 'string',
'fields'=> array(
'raw' => array(
'type' => 'string',
'index' => 'not_analyzed'
)
)
),
'Content' => array(
'type' => 'string'
),
'Image' => array(
type' => 'string',
'analyzer' => 'standard'
)
)
)
)
)
查询字符串如下所示,我希望在“15-game”这样的文本中搜索“15-g”:
"query" : {
"query_string": {
"query": "*15-g*",
"fields": [ "Title", "Content" ]
}
}
如果我重复这个问题,请接受我的道歉,但我无法找出发生了什么以及为什么它没有 return 任何结果。
我已经看过了:
ElasticSearch - Searching with hyphens in name
ElasticSearch - Searching with hyphens in name
但我不能和我一起工作。
真正有趣的是,如果我搜索“15 - g”(15space-spaceg) 它 return 结果。
在此先感谢您!
也将 .raw
字段添加到您的 Content
并在 .raw
字段上进行搜索:
{
"query": {
"query_string": {
"query": "*15-g*",
"fields": [
"Title.raw",
"Content.raw"
]
}
}
}
任何你想要搜索的文本中有 space 并且你想要 space要匹配您的字段,需要对其进行转义(使用 \
)。此外,任何时候你有大写字母和通配符并且你想像这样与 .raw
字段匹配,你需要将 lowercase_expanded_terms
设置为 false
,因为默认情况下该设置为 [=19] =],它将小写搜索字符串(它将搜索 laptop - black
):
{
"query": {
"query_string": {
"query": "*Laptop\ -\ Black*",
"lowercase_expanded_terms": false,
"fields": [
"Title.raw",
"Content.raw"
]
}
}
}
在 elasticsearch 5 中,您可以使用过滤器设置来定义自定义分析器。 这是示例代码:
PUT test1
{
"settings" : {
"analysis" : {
"analyzer" : {
"myAnalyzer" : {
"type" : "custom",
"tokenizer" : "whitespace",
"filter" : [ "dont_split_on_numerics" ]
}
},
"filter" : {
"dont_split_on_numerics" : {
"type" : "word_delimiter",
"preserve_original": true,
"generate_number_parts" : false
}
}
}
},
"mappings": {
"type_one": {
"properties": {
"title": {
"type": "text",
"analyzer": "standard"
}
}
},
"type_two": {
"properties": {
"raw": {
"type": "text",
"analyzer": "myAnalyzer"
}
}
}
}
}
请知道我设置了
"preserve_original": true "generate_number_parts"
这样字符串“2-345-6789”将保持原样。 Dash 是 elasticsearch 中的保留字。如果没有上述设置,标准分词器将生成“2”、“345”和“6789”。所以,现在您可以使用 "wildcard" 搜索即。
"5-67"
得到结果。
POST test1/type_two/1
{
"raw": "2-345-6789"
}
GET test1/type_two/_search
{
"query": {
"wildcard": {
"raw": "*5-67*"
}
}
}