在Elasticsearch中包含查询或部分匹配

时间:2018-09-27 07:07:13

标签: elasticsearch

我正在寻找一个单词“修改”,它可能在数据中以“修改”,“修改”甚至“ *修改”出现。搜寻这些单词的最佳方法是什么?我知道通配符可以实现此目的,但是由于代码的其他部分,我被限制为不使用它。提供更好的搜索性能的方法有哪些?

3 个答案:

答案 0 :(得分:0)

您可以使用elasticsearch的 query_string 功能来实现此目的。假设您使用默认的standard analyzer

{  
   "query":{  
      "query_string":{  
         "default_field":"Customer",
         "query":"*Jo*"
      }
   }
} 

您可以添加多个字段,如下面的查询所示

{  
   "query":{  
      "query_string":{  
         "fields":[  
            "Customer",
            "Name"
         ],
         "query":"*Jo*"
      }
   }
}

答案 1 :(得分:0)

有多种方法:

如前所述,您不能使用通配符,然后输入query_string

{  
   "query":{  
      "query_string":{  
         "default_field":"text",
         "query":"*amend"
      }
   }
}

第二,您可以使用n-gram标记器。您可以在这里https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html

进行检查

这会将您的值“修改”破坏为[[ame],“ men”,“ end” ...等]

一旦完成了应用n-gram代币检查的工作,就开始为数据编制索引。

您可以如下查询:

{"query":{"term":{"text":"amend"}}}

您将获得输出结果。

答案 2 :(得分:0)

您用术语“修改”,“修改”和“修改”描述的内容称为关键字词干。您可以在弹性索引设置中添加stemmer token filter

例如:

PUT /my_index
{
    "settings": {
        "analysis" : {
            "analyzer" : {
                "my_analyzer" : {
                    "tokenizer" : "standard",
                    "filter" : ["standard", "lowercase", "my_stemmer"]
                }
            },
            "filter" : {
                "my_stemmer" : {
                    "type" : "stemmer",
                    "name" : "english"
                }
            }
        }
    }
}

使用此词干提取器会将[amend, amending, amendment]项索引为[amend, amend, amend]

然后您可以进行match查询,它应该返回您想要的内容。