Elasticsearch:查找子串匹配
我想要执行确切的单词匹配和部分单词/子串匹配。 例如,如果我search“男士razor”,那么我应该能够在结果中find“男士razor”。 但是,如果我search“en的razor”,那么我也应该能够find“男士razor”的结果。 我使用以下设置和映射:
索引设置:
PUT /my_index { "settings": { "number_of_shards": 1, "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/my_type/_mapping { "my_type": { "properties": { "name": { "type": "string", "index_analyzer": "autocomplete", "search_analyzer": "standard" } } } }
插入logging:
POST /my_index/my_type/_bulk { "index": { "_id": 1 }} { "name": "men's shaver" } { "index": { "_id": 2 }} { "name": "women's shaver" }
查询:
1.通过精确的词组匹配 – >“男性”
POST /my_index/my_type/_search { "query": { "match": { "name": "men's" } } }
以上查询返回返回结果中的“男士razor”。
2.通过部分词匹配 – >“EN的”
POST /my_index/my_type/_search { "query": { "match": { "name": "en's" } } }
上面的查询不会返回任何东西。
我也试过下面的查询
POST /my_index/my_type/_search { "query": { "wildcard": { "name": { "value": "%en's%" } } } }
还没有得到任何东西。 我认为这是因为索引上的“edge_ngram”typesfilter无法find“部分词/ sbustring匹配”。 我也尝试过“n-gram”types的filter,但是它会减慢search速度。
请build议我如何使用相同的索引设置来实现excact词组匹配和部分词组匹配。
要search部分字段匹配和完全匹配,如果将字段定义为“未分析”或关键字(而不是文本),则使用通配符查询会更好。
另见这个 。
要使用通配符查询,请在要search的string的两端追加*
POST /my_index/my_type/_search { "query": { "wildcard": { "name": { "value": "*en's*" } } } }
要使用不区分大小写 ,请使用带有小写筛选器和关键字标记器的自定义分析器。
定制分析仪:
"custom_analyzer": { "tokenizer": "keyword", "filter": ["lowercase"] }
使searchstring小写
如果你得到searchstringasd :改为* asd *
通过search任何string或子string使用:
query: { or: [{ match_phrase_prefix: { name: str } }, { match_phrase_prefix: { surname: str } }] }
快乐的编码与弹性search….