ElasticSearch 在单词中使用连字符进行搜索
Posted
技术标签:
【中文标题】ElasticSearch 在单词中使用连字符进行搜索【英文标题】:ElasticSearch searching with hyphen inside a word 【发布时间】:2015-09-26 21:43:58 【问题描述】:我想寻求帮助。我想在标题和内容中搜索单词。这是结构
'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
ElasticSearch - Searching with hyphens in name
ElasticSearch - Searching with hyphens in name
但我不能和我一起工作。
真正有趣的是,如果我搜索“15 - g”(15space-spaceg),它会返回结果。
非常感谢您!
【问题讨论】:
【参考方案1】:将.raw
字段添加到您的Content
并在.raw
字段上进行搜索:
"query":
"query_string":
"query": "*15-g*",
"fields": [
"Title.raw",
"Content.raw"
]
在您想要搜索的文本中有 空格 并且您想要该空格以匹配您的字段时,需要对其进行转义(使用 \
) .此外,只要您有大写字母和通配符,并且想要与.raw
字段匹配,您需要将lowercase_expanded_terms
设置为false
,因为默认情况下该设置为true
,它将小写搜索字符串(它将搜索laptop - black
):
"query":
"query_string":
"query": "*Laptop\\ -\\ Black*",
"lowercase_expanded_terms": false,
"fields": [
"Title.raw",
"Content.raw"
]
【讨论】:
谢谢@Andrei,它有效!如果我想搜索两个或更多的词怎么办。 “笔记本电脑 - 黑色”可以说我有“Windows 笔记本电脑 - 黑色”,我想用“笔记本电脑 - 黑色”找到它。再次感谢你。问候。 在您想要搜索的文本中有 空格 并且您想要 匹配您的字段的任何地方,都需要对其进行转义。此外,只要您有大写字母和通配符,并且想要与.raw
字段匹配,您需要将lowercase_expanded_terms
设置为false
,因为它将小写搜索字符串。更新了我的回复。
非常感谢@Andrei。我感谢你的努力。一切都按照您的解释进行。 :)
您能告诉我如何使搜索不区分大小写吗?问候【参考方案2】:
在 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”。因此,现在您可以使用“通配符”搜索,即。
"5-67"
得到结果。
POST test1/type_two/1
"raw": "2-345-6789"
GET test1/type_two/_search
"query":
"wildcard":
"raw": "*5-67*"
详细信息可以在elastic search tokenfilter找到
【讨论】:
以上是关于ElasticSearch 在单词中使用连字符进行搜索的主要内容,如果未能解决你的问题,请参考以下文章
使用 NEST 的 Elasticsearch:如何配置分析器来查找部分单词?