我正在尝试在ElasticSearch中运行类似的字段查询:
select * from products where 'milk' like '%'+name+'%'
意思是我正在尝试查找所有文档,其中产品名称在这种情况下是’milk’的子字符串。
我该怎么做?
我会使用一个使用ngrams的自定义分析器。首先创建一个像这样的索引:
curl -XPUT 'localhost:9200/tests' -d ' { "settings" : { "analysis" : { "analyzer" : { "my_analyzer" : { "tokenizer" : "ngrams" } }, "tokenizer" : { "ngrams" : { "type" : "nGram", "min_gram" : "2", "max_gram" : "10" } } } }, "mappings": { "test": { "properties": { "product_name": { "type": "string", "analyzer": "standard", "search_analyzer": "my_analyzer" } } } } }'
然后,您可以索引一些数据:
curl -XPOST 'localhost:9200/tests/test/_bulk' -d ' {"index":{}} {"product_name": "bc"} {"index":{}} {"product_name": "cd"} {"index":{}} {"product_name": "def"} '
最后,您可以像这样搜索:
curl -XPOST 'localhost:9200/tests/_search' -d '{ "query": { "match": { "product_name": "abcde" } } }'
然后您将获得前两个文档bc,cd
bc
cd