我想请求帮助。我想在标题和内容中搜索单词。这是结构
'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" ]
}
}
如果我复制了这个问题,请接受我的道歉,但我无法知道发生了什么以及为什么它不会返回任何结果。
我已经看过了:
ElasticSearch - Searching with hyphens
但我无法与我合作。
真正有趣的是,如果我搜索“15-g”(15 空间 - 空间 g),它将返回结果。
提前非常感谢你!
答案 0 :(得分:1)
在.raw
添加Content
字段,然后在.raw
字段中进行搜索:
{
"query": {
"query_string": {
"query": "*15-g*",
"fields": [
"Title.raw",
"Content.raw"
]
}
}
}
如果您要搜索的文字中有空格的任何地方,并且想要该空间与您的字段匹配,则需要对其进行转义(使用{{1} })。此外,只要您拥有大写字母和通配符,并且希望与\
字段匹配,就需要将.raw
设置为lowercase_expanded_terms
,因为默认设置为{{1}它将小写搜索字符串(它将搜索false
):
true
答案 1 :(得分:0)
在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":是的 " 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*"
}
}
}
找到