Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search 弹性搜索中的自动完成匹配_Search_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Autocomplete_Full Text Search_Search Engine - Fatal编程技术网 elasticsearch,autocomplete,full-text-search,search-engine,Search,elasticsearch,Autocomplete,Full Text Search,Search Engine" /> elasticsearch,autocomplete,full-text-search,search-engine,Search,elasticsearch,Autocomplete,Full Text Search,Search Engine" />

Search 弹性搜索中的自动完成匹配

Search 弹性搜索中的自动完成匹配,search,elasticsearch,autocomplete,full-text-search,search-engine,Search,elasticsearch,Autocomplete,Full Text Search,Search Engine,因此,我在弹性搜索中有一个标识符字符串字段,其中包含D123、M1、T23等值 我正在尝试将autocomplete构建到该字段的搜索中,以便D12的查询可能匹配D12,D120,D121,…,D1210等 目前,我已经构建了一个定制的edge ngram过滤器和分析仪,如下所示: “过滤器”:{ “自动完成过滤器”:{ “类型”:“edgeNGram”, “最小克”:2, “最大克数”:10 } } “分析器”:{ “自动完成”:{ “类型”:“自定义”, “标记器”:“空白”, “过滤器”:

因此,我在弹性搜索中有一个
标识符
字符串字段,其中包含
D123
M1
T23
等值

我正在尝试将autocomplete构建到该字段的搜索中,以便
D12
的查询可能匹配
D12
D120
D121
,…,
D1210

目前,我已经构建了一个定制的edge ngram过滤器和分析仪,如下所示:

“过滤器”:{
“自动完成过滤器”:{
“类型”:“edgeNGram”,
“最小克”:2,
“最大克数”:10
}
}
“分析器”:{
“自动完成”:{
“类型”:“自定义”,
“标记器”:“空白”,
“过滤器”:{“小写”、“自动完成过滤器”}
}
}
在我的映射中,当索引时,我在
标识符
字段中使用它:

“标识符”:{
“类型”:“字符串”,
“分析器”:“自动完成”,
“搜索引擎分析器”:“标准”
}
这意味着为
D1234
编制索引的NGRAM是
D1
D12
D123
D1234

要对此提出质疑,我的做法如下:

“查询”:{
“布尔”:{
“应该”:{
“匹配”:{
“标识符”:{
“查询”:“D12”,
“模糊性”:0
}
}
}
}
}
这将返回从最长到最短的结果,因此
D12
显示在结果的末尾。我如何确保尽可能短的标识符具有最高的相关性分数

我的猜测是
D12
查询与ngram的匹配是这样的:
[{D12},{D12}3,{D12}34]
,弹性搜索是“哦,太好了,3个匹配!”而不是
D12
结果将给出的1
[{D12}]

我猜有一种解决方案可能没有部分匹配这些ngrams,因此弹性搜索可以看到两个结果的
[{D12}]
,但排名
D12
高于
D1234
,因为它匹配的是ngrams的1/2,而不是1/4。但我不确定如何配置弹性搜索来给出这个结果

任何帮助都将不胜感激。

您可以使用,但首先需要将您的
标识符
字段映射为
多字段
,如下所示

"identifier": {
    "type": "string",
    "analyzer": "autocomplete",
    "search_analyzer": "standard",
    "fields": {
        "raw": {
            "type": "string",
            "index": "not_analyzed"
        }
    }
}
您需要这样做,因为如果您直接在
标识符上对
进行排序
,那么您将得到相同的结果,因为由于
边缘ngram过滤器
,它们都将具有两个字母标记。之后,这将给你想要的结果

{
  "query": {
    "bool": {
      "should": {
        "match": {
          "identifier": {
            "query": "D12",
            "fuzziness": 0
          }
        }
      }
    }
  },
  "sort": {
    "_script": {
      "script": "doc['identifier.raw'].value.length()",
      "order": "asc",
      "type": "number"
    }
  }
}

希望这有帮助

您使用的是什么版本的ES?解决方案有效吗?嘿,巴德,对不起,我还没有机会实现它并亲自尝试。它会在附加的
bool
条件下工作还是会覆盖这些条件?没问题,巴德,我几乎可以肯定它会在不同的bool条件下工作,但如果你能发布完整的查询,我可以测试它,并确保100%的酷巴德,我会尽快查看它。伙计,再次感谢你的回答。当我只想查询这一个字段,但当合并其他查询时,它完全超越了相关性得分时,这种方法就起作用了。我不确定我是否能够按照我的需求进行脚本排序。我还想提及其他任何一个,在较新版本的ES(我使用的是ES 2.1)中默认禁用内联脚本。您可以启用此功能。或者将脚本创建为
.groovy
文件,并将其放在您的
/config/scripts/
目录中。