Elasticsearch实战——近似文本查询(more_like_this query)

Elasticsearch实战——近似文本查询(more_like_this query)

more_like_this query可以查询和提供文本类似的文档,通常用于近似文本的推荐场景。

查询命令如下:

{
	"query":{
		"more_like_this":{
			"fields":["title"],
			"like":"凤凰自行车",
			"min_term_freq":1,
			"max_query_terms":12
		}
	}
}

可选的查询参数如下:

  • fields:需要匹配的字段。
  • like:要匹配的文本。
  • min_term_freq:文档中词项的最低频率,默认是2,低于此频率的文档会被忽略。
  • max_query_terms:query中能包含的最大词项数目,默认为25。
  • min_doc_freq:最小的文档频率,默认为5。
  • max_doc_freq:最大文档频率。
  • min_word_length:单词的最小长度。
  • max_word_length:单词的最大长度。
  • stop_words:停用词列表。
  • analyzer:分词器。
  • minimum_should_match:文档应该匹配的最小单词数量,默认为query分词后词项的30%。
  • boost_terms:词项的权重。
  • include:是否把输入文档作为结果返回。
  • boost:整个query的权重,默认为1.0。

关注我

搜索微信公众号:java架构强者之路
在这里插入图片描述

### 如何在 Elasticsearch 中实现类似于 SQL 的模糊查询like)功能 #### 使用 `wildcard` 查询 为了实现在Elasticsearch中类似SQL `%关键字%`的单纯模糊查询,可以采用`wildcard`查询。这种查询允许指定通配符模式来进行前缀、后缀以及中间部分的匹配[^1]。 ```json GET /_search { "query": { "wildcard": { "field_name": "*AAA*" } } } ``` 此方法适用于不需要分词器处理的情况,即希望保持搜索项作为一个整体进行匹配而不是拆分成单独字符或词语的情形下非常有用。 #### 利用 nGram 分析器 另一种方案是通过配置自定义分析链,在索引阶段应用nGram过滤器创建子字符串片段。当执行查询操作时,则能够高效定位含有特定连续字符序列的文档[^3]。 首先设置映射: ```json PUT my_index { "settings": { "analysis": { "analyzer": { "ngram_analyzer": { "type": "custom", "tokenizer": "standard", "filter": ["lowercase", "ngram_filter"] } }, "filter": { "ngram_filter": { "type": "ngram", "min_gram": 2, "max_gram": 50 } } } }, "mappings": { "_doc": { "properties": { "content_field": { "type": "text", "analyzer": "ngram_analyzer", "search_analyzer": "standard" } } } } } ``` 接着就可以像平常一样使用match或者term查询了,因为底层已经由nGram负责构建必要的索引来支持灵活的部分匹配需求。 #### Phrase Matching 方案 对于某些场景而言,如果仅仅是想要确保几个单词按照顺序出现而不想启用复杂的全文本解析过程的话,那么phrase matching是一个不错的选择。它能保证词条间的相对位置不变从而达到近似于“精确短语”的效果。 ```json GET /my_index/_search { "query": { "match_phrase": { "content_field": "AAA" } } } ``` 以上三种方式都可以满足不同业务逻辑下的模糊查找需求,具体选用哪一种取决于实际应用场景的要求以及性能考量因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值