我正在使用ElasticSearch的PHP客户端,每当我想搜索字符串中"隐藏"的单词时,我发现很难返回带有分数的结果.
我想获得所有文件,其中字段"文件"具有单词"anses",文件的名称如下: axx14anses19122015.zip
我知道我应该对这些话语进行标记,不能意识到该怎么做.我也读过关于聚合的内容,但我是ES的新手,我必须尽快交付工作.
REGEXP:使用正则表达式非常昂贵,并且不返回任何分数,这是必须具有的,以便缩小结果并为用户提供准确的信息.
通配符:同样的事情,缓慢而没有分数
我自己的脚本,我有一个字典,并使用正则表达式搜索关键词,如果匹配,在该匹配的文档中创建一个新的字段与单词.原因是创建一个TOKEN所以在将来的搜索中我可以使用常规匹配分数.否定的一面:我的老板完全拒绝了字典的事情所以我在这里要求任何想法.
提前致谢.
我建议在你的情况下,nGram tokenizer查看示例我将创建一个分析器和一个doc类型的映射
PUT /test_index
{
"settings": {
"number_of_shards": 1,
"analysis": {
"tokenizer": {
"ngram_tokenizer": {
"type": "nGram",
"min_gram": 4,
"max_gram": 4,
"token_chars": [ "letter", "digit" ]
}
},
"analyzer": {
"ngram_tokenizer_analyzer": {
"type": "custom",
"tokenizer": "ngram_tokenizer",
"filter": [
"lowercase"
]
}
}
}
},
"mappings": {
"doc": {
"properties": {
"text_field": {
"type": "string",
"term_vector": "yes",
"analyzer": "ngram_tokenizer_analyzer"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
之后,我将使用您的文件名插入文档
PUT /test_index/doc/1
{
"text_field": "axx14anses19122015"
}
Run Code Online (Sandbox Code Playgroud)
现在我将只使用查询匹配
POST /test_index/_search
{
"query": {
"match": {
"text_field": "anses"
}
}
}
Run Code Online (Sandbox Code Playgroud)
并会收到这样的回应
{
"took": 8,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.10848885,
"hits": [
{
"_index": "test_index",
"_type": "doc",
"_id": "1",
"_score": 0.10848885,
"_source": {
"text_field": "axx14anses19122015"
}
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
我做了什么?我刚刚创建了一个nGram标记器,它将以4个字符的形式爆炸我们的字符串,并将这些术语分开索引,当我搜索字符串的一部分时将搜索它们.要了解更多信息,请阅读这篇文章https://qbox.io/blog/an-introduction-to-ngrams-in-elasticsearch 希望对您有所帮助!
| 归档时间: |
|
| 查看次数: |
490 次 |
| 最近记录: |