Elasticsearch优化查询

时间:2016-09-21 09:18:48

标签: elasticsearch

我们正在使用弹性搜索来实现搜索公司列表,但它不是我们所期望的

**Example companies:**      
Infosys technologies        
Infosys technologies ltd        
Infosys technologies pvt ltd        
Infosys technologies Limited        
Infosys technologies Private Limited        
BAC Infosys ltd

情景:

  1. 搜索关键字“Infosys”时,应返回“Infosys”     技术“列表。

  2. 在搜索关键字“Infosys ltd”时,应返回“Infosys” 技术“列表。

  3. 在搜索关键字“BAC Infosys ltd”时,应返回“BAC” Infosys ltd“list。

  4. 使用以下设置和映射

    {
       "settings": {
          "analysis": {
             "filter": {
                "nGram_filter": {
                   "type": "nGram",
                   "min_gram": 3,
                   "max_gram": 3,
                   "token_chars": [
                      "letter",
                      "digit",
                      "punctuation",
                      "symbol"
                   ]
                }
             },
             "analyzer": {
                "nGram_analyzer": {
                   "type": "custom",
                   "tokenizer": "keyword",
                   "filter": [
                      "lowercase",
                      "asciifolding",
                      "nGram_filter"
                   ]
                },
                "keyword_analyzer": {
                   "type": "custom",
                   "tokenizer": "keyword",
                   "filter": [
                      "lowercase",
                      "asciifolding"
                   ]
                }
             }
          }
       },
       "mappings": {
           "companies": {
                 "properties": {
                     "company_name": {
                         "type": "string",
                         "store": "true",
                         "index_analyzer": "nGram_analyzer",
                         "search_analyzer": "keyword_analyzer",
                         "null_value": "null"
                     }
                 }
             }
       }
    }
    

    查询:

    {"query":
        {
          "bool": {
            "must": [
              { "match": { "company_name": "Infosys technologies" }}
            ],
            "minimum_should_match": "80%"
          }
        }
    }
    

    请帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

你在搜索查询和映射方面都缺少一些东西。在你的场景中查看并使用你当前的映射设置 1)结果也将具有BAC值。你应该切换到边缘n-gram。但这不允许你从中间搜索。 2)它还取决于您正在构建的搜索类型,您可以避免我在1中建议的安排。对于您的所有场景,我们假设您的列表也可以在场景的结果中具有BAC值,但在列表中排名较低。为此,您可以使用带模糊的proximity queries查询进行拼写检查。

以上三种情况无法向我解释整个功能并使用-cases作为搜索功能,但我认为弹性提供的邻近搜索可以让您更灵活地满足您的情况。

答案 1 :(得分:0)

带状疱疹可以帮助: https://www.elastic.co/guide/en/elasticsearch/guide/current/shingles.html

对于您的情况,shingle filter分析器不相关,它应该影响性能和相关性得分。使用custom analyzerstandard tokenizer创建lowercase filter和{{1}}。

HTH,