我是否认为你只能在一个字段上使用1 search analyzer
?
例如,我说我的title
字段为multi-field
special_title
,我是否可以title
指定search_analyzer1
和{ {1}}另一个特定的special_title
?这是一个映射来说明我的意思:
search_analyzer2
似乎这是不可能的,这是证明它的要点:
{
"title": {
"analyzer": "standard",
"search_analyzer": "search_analyzer1",
"type": "string",
"fields": {
"special_title": {
"type": "string",
"index": "analyzed",
"analyzer": "standard",
"search_analyzer": "search_analyzer2"
}
}
}
}
查询返回0结果,我希望"抗真菌药"将传递给 PUT /my_index
{
"settings": {
"analysis": {
"char_filter":{
"hyphen":{
"type": "pattern_replace",
"pattern": "[-]",
"replacement": ""
},
"space":{
"type": "pattern_replace",
"pattern": " ",
"replacement": ""
}
},
"analyzer": {
"merge":{
"type":"custom",
"tokenizer":"standard",
"filter": [
"lowercase"
],
"char_filter": ["hyphen", "space", "html_strip"]
}
}
}
},
"mappings": {
"my_type": {
"properties": {
"title": {
"type": "string",
"analyzer": "standard",
"search_analyzer": "standard",
"fields": {
"title_merge" : {
"type": "string",
"analyzer": "standard",
"search_analyzer": "merge"
}
}
}
}
}
}
}
delete my_index
PUT my_index/my_type/1
{
"title": "antiemetics"
}
GET my_index/_search
{
"query": {
"query_string" : {
"fields" : ["title", "title_merge"],
"default_operator": "AND",
"query" :"anti emetics",
"use_dis_max" : true
}
}
}
搜索分析器,然后将查询标记为merge
,以便它可以匹配索引中的标记。所以看起来不可能,这是非常奇怪和令人失望的。
我可以通过匹配查询按预期启动合并分析器,但不能使用query_string,如果它是一个带连字符的术语,我不能指望用户输入带引号的术语寻找。
antiemetics
答案 0 :(得分:1)
是的,可以为每个字段提供自己的search_analyzer
查询
{
"query": {
"match": {
"title": "title one"
}
}
}
在这种情况下,search_analyzer1
将应用于"标题1"和
{
"query": {
"match": {
"title.special_title": "title two"
}
}
}
这将是analyzed
与search_analyzer2
编辑1
您的查询存在两个问题。
1)您应该使用title_merge
title.title_merge
2)考虑到您的分析仪设置,我认为您正在寻找的是精确匹配。您当前的查询正在查找两个单独的令牌反 AND emetics
您需要使用双引号来获得预期结果。来自Docs
查询字符串被解析为一系列术语和运算符。一个 术语可以是单个单词 - 快速或棕色 - 或短语,包围 用双引号 - "快速棕色" - 搜索中的所有单词 这个短语,顺序相同。
我认为此查询可以正常工作
GET my_index/_search
{
"query": {
"query_string": {
"fields": [
"title*"
],
"query": "\"anti emetics\"",
"use_dis_max": true
}
}
}
现在ES会将anti emetics
视为短语,由于antiemetics
space
,它会合并到char_filter
,您将获得预期的结果。
这有帮助吗?