我已经按照this guide创建了自动补全搜索...我正在做的是使用Edge NGram标记程序,对我的一个字段(标题)进行标记。我将这些Edge NGram用于自动完成搜索this is my solution。
自动完成功能可以正常工作...但是它破坏了我的搜索功能...因为现在当我使用主搜索(而不是自动完成)时,它仍会搜索NGram ...例如,如果我搜索“滑雪”,结果将同时包含Ski和Skirt。对于我的主要搜索,我不希望Skirt成为搜索Ski时的匹配项。
是否可以将Elasticsearch配置为在某些查询中忽略Edge NGram,并在其他查询中使用它们?
答案 0 :(得分:2)
我有类似的要求,但是在我的应用程序中,自动完成功能不同于主要搜索。自动完成会在用户键入时发生,而主搜索会在用户按Enter时发生。
根据您的情况,自动完成和主要搜索结果在我们的应用程序中有所不同。这也是一般惯例。
我如何解决此用例:-
对于自动完成而不是索引时间,我们使用https://www.elastic.co/guide/en/elasticsearch/guide/master/prefix-query.html做索引时间和查询时间是有利有弊的。
对于主搜索,它不使用前缀搜索,因此不会发生部分搜索。
示例
1.如果标题字段包含foo
,bar
,hello
,world
,则前缀搜索将带来f
,fo
的结果,但不包含oo
。如果您希望oo
是可搜索的,那么您需要使用2个不同的字段进行自动完成和主要搜索,这是唯一的解决方案。
否则,在自动完成的情况下,只需将查询类型更改为prefix即可,在这种情况下,索引大小也将非常小。
我们对是否使用Edge-N gram令牌进行了一些测试,然后将索引大小增加了一倍,这对我们来说不是一个选择,因为我们的索引很大。
修改
如果您想进行子字符串搜索,则对于术语runni
,您希望标题New Balance Running Shoes
出现在搜索结果中,然后建议您创建2个字段,例如title_autocomplete,该字段使用边缘n-gram分析器并用于自动完成查询和标题,它使用其他一些分析器(例如标准)或其他可以解决您的主要搜索用例的东西。