如何使用ElasticSearch索引搜索单词的一部分

时间:2016-02-12 06:18:34

标签: php elasticsearch lucene

我最近开始使用ElasticSearch,我似乎无法让它搜索一个单词的一部分。

示例:我在我的couchdb中有三个文件,在ElasticSearch中编入索引:

{
 "_id" : "1",
 "name" : "John Doeman",
 "function" : "Janitor"
}
{
 "_id" : "2",
 "name" : "Jane Doewoman",
 "function" : "Teacher"
}
{
 "_id" : "3",
 "name" : "Jimmy Jackal",
 "function" : "Student"
} 

所以现在,我想搜索包含“Doe”的所有文件

curl http://localhost:9200/my_idx/my_type/_search?q=Doe

这不会返回任何命中。但是,如果我搜索

curl http://localhost:9200/my_idx/my_type/_search?q=Doeman

它确实返回一个文件(John Doeman)。

尝试使用此网址http://localhost/el/index.php?str=*doe*

<?php
require 'vendor/autoload.php';
$client = Elasticsearch\ClientBuilder::create()->build();

$params = array();
$params['index'] = 's3';
$params['type'] = 's3files';
$params['body']['query']['match']['content'] = $_GET['str'];

$result = $client->search($params);
echo "<pre>";
print_r($result);

当我搜索“Doe”时,如何让ElasticSearch找到John Doeman和Jane Doewoman?

2 个答案:

答案 0 :(得分:0)

您可以先尝试使用通配符:

curl http://localhost:9200/my_idx/my_type/_search?q=Doe*

如果这就够了,你可以侥幸逃脱。否则,通过创建边缘ngram tokenizersfilters的自定义分析器,还有其他更高级的解决方案。

答案 1 :(得分:0)

您可以尝试此操作,通配符查询匹配包含与通配符表达式匹配(未分析)的字段的文档。

      curl http://localhost:9200/my_idx/my_type/_search
      {"query":
        {
       "wildcard" : { "name" : "doe*"  }
         }
      }