Elasticsearch:在字符串中搜索单词并获得分数的最佳方法是什么?

len*_*ord 0 php elasticsearch

我正在使用ElasticSearch的PHP客户端,每当我想搜索字符串中"隐藏"的单词时,我发现很难返回带有分数的结果.

这是一个例子:

我想获得所有文件,其中字段"文件"具有单词"anses",文件的名称如下: axx14anses19122015.zip

我所知道的

我知道我应该对这些话语进行标记,不能意识到该怎么做.我也读过关于聚合的内容,但我是ES的新手,我必须尽快交付工作.

到目前为止我尝试过的

  • REGEXP:使用正则表达式非常昂贵,并且不返回任何分数,这是必须具有的,以便缩小结果并为用户提供准确的信息.

  • 通配符:同样的事情,缓慢而没有分数

  • 我自己的脚本,我有一个字典,并使用正则表达式搜索关键词,如果匹配,在该匹配的文档中创建一个新的字段与单词.原因是创建一个TOKEN所以在将来的搜索中我可以使用常规匹配分数.否定的一面:我的老板完全拒绝了字典的事情所以我在这里要求任何想法.

提前致谢.

Wal*_*eto 5

我建议在你的情况下,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 希望对您有所帮助!