我试图复制ElasticSearch网站上搜索功能的确切行为。
有人知道在哪里可以找到映射/设置的来源吗?查询是如何执行的?
主要需求:
场景
假设我有以下数据集:
ID, NAME
1, SoftwareRocks everytime
10, The is nothing like home
8, Opacc Software AG is good but software is even better
2, Opacc Software AG
3, Sage KHK Software AG
4, Software AG
5, bbv Software Services AG
6, Software AG2
7, Sof on the world测试1
输入:sof
输出:
测试2
输入:软
输出:
测试3
输入:软件
输出:
测试4
输入:软件ag
输出:
Try 1
PUT /my_index
{
"settings": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
}
}
PUT /my_index/_mapping/my_type
{
"type": {
"properties": {
"name": {
"type": "string",
"analyzer": "autocomplete",
"search_analyzer": "standard"
}
}
}
GET /my_index/my_type/_search
{
"query": {
"match": {
"name": "software"
}
}
}Try 2
{"query" : {"match_phrase_prefix": { "name": "Software ag" }}}这是正确的返回,但重点似乎关闭。例如:
我所期望的是搜索词会受到高度重视。返回元素的顺序应该基于整个项的长度。
发布于 2016-11-09 18:02:03
尝试这个查询。这将高亮搜索结果。
{
'query':{
'filtered':{
'query':{
'match':{
'_all':{
'query':"soft",
'type':'phrase'
}
}
}
}
},
'highlight':{
'pre_tags':'<em>',
'post_tags':'</em>',
'fields':{'*':{}}
}
}发布于 2016-11-09 18:35:48
好的,您的用例非常简单。“弹性网站上的自动完成”也是“自动完成”的直接用例,但它们具有多个字段结构的搜索数据集,以及来自该字段的匹配关键字也决定了搜索结果的相关性/顺序。
为了保持简单,我将使用ngram令牌器作为映射中的字符串,并执行简单的过滤搜索映射
{
"analysis": {
"analyzer": {
"autocomplete_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": ["standard", "lowercase", "asciifolding", "filter_ngram"]
}
},
"filter": {
"filter_stop": {
"type": "stop",
"stopwords": "_english_",
"ignore_case": true
},
"filter_shingle": {
"type": "shingle",
"max_shingle_size": 2,
"min_shingle_size": 2,
"output_unigrams": true
},
"filter_snowball": {
"type": "snowball",
"language": "english"
},
"filter_stemmer": {
"type": "porter_stem",
"language": "English"
},
"filter_ngram": {
"type": "nGram",
"min_gram": 3,
"max_gram": 15
},
"filter_edgengram": {
"type": "edgeNGram",
"min_gram": 2,
"max_gram": 15
},
"filter_worddelimiter": {
"type": "word_delimiter"
}
},
"tokenizer": {
"haystack_ngram_tokenizer": {
"type": "nGram",
"min_gram": 3,
"max_gram": 15
},
"haystack_edgengram_tokenizer": {
"type": "edgeNGram",
"min_gram": 2,
"max_gram": 15,
"side": "front"
}
}
}
}这些映射还包括一些我在自动完成解决方案中使用的高级过滤器。
{
"query": {
"filtered": {
"filter": {
"term": {
"FIELD": "VALUE"
}
}
}
}
}弹性示例不对输入的关键字执行拼写检查/模糊查询。
如果您也想添加fuzzy,那么您还可以查看上面的文档,根据您的用法和调优模糊性来构建一个模糊查询。
https://stackoverflow.com/questions/40509445
复制相似问题