Elasticsearch显示与查询匹配的内容

问题描述 投票:1回答:1

我正在实现一种“自然语言”搜索助手。我有一个带有许多选择字段的表格。每个字段中的选项列表可能很长。因此,我不必添加每个选项,而是添加了一个文本输入框,人们可以在其中输入他们要查找的内容,并且该应用程序将根据选择下拉菜单中的选项建议可能的搜索。

假设我的选择是:

  • 颜色:红色,蓝色,黑色,黄色,绿色
  • 大小:非常小,有点中等,超大
  • 形状:圆形,正方形,长方形,圆柱形
  • 年份:2007、2008、2009、2010

如果输入“ 2007非常小的星形装饰”,则文本输入将建议“在所有2007非常小的窗口小部件中搜索“星形装饰”。据了解,“ 2007”和“非常小”是表格中的选择选项,而“星条状”则不是,建议搜索选择“ 2007”和“非常小”,然后保留“星” -spangled“位用于纯文本搜索。

我现在正在研究的是解析搜索查询,并挑选出适合选择字段的位。我在Elasticsearch中拥有所有选项(例如颜色类型,形状类型等)。我正在考虑分别搜索每种类型,以查看其是否与搜索查询中的任何内容匹配。在我看来,这很简单。我可以轻松找到匹配项。但是,我不知道查询的哪一部分实际上与每种类型匹配,我需要哪一部分来找出例如“星状闪烁”部分与选项不匹配。

所以,最后,我需要知道只有“ 2007”子字符串与年份匹配,只有“非常小”子字符串与大小匹配,而“ star-spangled”没有任何匹配。

[我的第一个想法是将查询拆分为字元图(例如“ 2007”,“ 2007非常”,“ 2007非常小”,“ 2007非常星状闪烁的星”,“非常”,“非常小”,“非常小的星状闪烁”,“小”,“小星状闪烁”,“星状闪烁”),并为每个克搜索每个选项。然后,我肯定会知道哪个克匹配。但是,这显然可能会很快占用大量资源。另外,我知道Elasticsearch可以在内部更快地进行这种搜索。

所以,我真正需要的是能够执行搜索,并与结果一起返回原始查询中实际匹配的部分。因此,如果我搜索“ 2007 verr small”(故意拼写错误)并进行了大小的模糊搜索,并传递了整个查询字符串,结果返回“ Very Small”大小,则表示“ verr small”是与该大小匹配的查询的一部分。

关于该怎么做的任何想法?还是可能有其他解决方案?

我可以进行搜索并解析结果,以查看哪些位与字符串匹配。尽管我可以看到这也是资源密集型的。而且,如果我正在执行模糊搜索,则不一定要清楚查询的哪一部分触发了结果匹配。

我还认为突出显示可能适用于此,但是我对Elasticsearch的了解还不够确定。

elasticsearch
1个回答
0
投票

Elasticsearch中有两种查询类型,MatchQueryFiltered Query。匹配查询匹配您在文档中的术语,并找到所有具有相关性得分的相关文档。例如,当您搜索术语“帮助解决JavaScript问题”时,您会对包含一个或多个serach查询的所有文档感兴趣。

[另一方面,当您使用过滤查询时,文档是匹配的还是不匹配的...这里没有相关性得分...例如,您希望所有在“ 2007”年生产的产品...这里您需要使用过滤查询。 2007年制造的所有产品均得分相同,其他所有年份均不包括在结果中。

我认为,您的问题应通过过滤查询...

[使用过滤器查询时,通常每个过滤器在UI中都有其自己的对应输入,请考虑以下来自ebay的屏幕截图:

enter image description here

如果我正确理解了您的要求,则希望将所有这些过滤器都包含在一个搜索框中。我认为这几乎是不可能实现的,因为您无法解析用户输入并确定哪个单词对应哪个过滤器...

如果要沿过滤器路径前进,最好为每个过滤器引入相应的UI字段...

[如果您想坚持使用单个搜索框,则不要实施过滤器功能并坚持使用Elasticsearch Multi-match查询...您可以在多个字段中匹配输入词,但您将无法进行过滤排除(排除)结果,而是获得相关性得分。

© www.soinside.com 2019 - 2024. All rights reserved.