我在MySQL中有下一个结构:
id
,title
,user_id
id
,title
group_id
,keyword_id
我搜索了5个案例:
title = "keyword"
title = "keyword"
title like "keyword%"
title like "%keyword%"
title like "%keyword%"
这些查询合并为一个查询。对于每个子查询,它会附加一个名为priority
的列,在该列上进行排序。
我的问题是:我应该如何配置ElasticSearch来执行上述情况,或者我应该如何构建Elastic查询以获得结果?我问,因为这个查询在Mysql上非常慢,我们做了很多优化,添加了索引,拆分表等,所有优化结果都是暂时的。
由于
答案 0 :(得分:0)
您是否希望分析您的关键字字段? 它必须是5个不同的情况吗?
您必须确定所需的可能查询类型。
因为通配符查询:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html
管理所有5个案例的搜索(对于非分析字段,虽然这意味着关键字子项未被标记化,但ES使用除盐分析器搜索关键字属性,除非您指定自定义分析器,否则使用简单空白分割单词)。
如果您想要更灵活的东西并且性能不是问题(已分析的属性),那么您可以使用ngram分析:https://www.elastic.co/guide/en/elasticsearch/reference/5.5/analysis-ngram-tokenizer.html
这个标记了你的子条款,这意味着它会根据你的ngram配置在多个字符中打破它。
您的文档映射当然应该在每种情况下指定分析器:
通配符研究==> not_analyzed
ngram研究==> ngram
PS:浏览ES文档时要注意。 ES版本规范非常重要,因为版本之间有很多折旧:)。在右侧选择安装的主要版本,然后浏览。