使用 ONGR Elastic Bundle for Symfony 进行子字符串搜索
Substring search with ONGR Elastic Bundle for Symfony
我正在为我的 Symfony3 项目使用 https://github.com/ongr-io/ElasticsearchBundle。这个包的原因是,我的项目正在使用 propel。
到目前为止一切正常,运行良好。
但现在我想添加搜索单词子字符串的可能性。例如有一些项目命名为 Test01、Test02、Test03 等,例如,当我尝试搜索 Test 时,我没有得到任何结果。就在我像 Test01.
这样输入整个单词的时候
我读过通配符搜索的可能性,但不同的解决方案表示,使用 ngram 或 edge_ngram 会是更好的解决方案。
我试过在配置中指定如下
ongr_elasticsearch:
analysis:
filter:
incremental_filter:
type: edge_ngram
min_gram: 3
max_gram: 10
analyzer:
incrementalAnalyzer:
type: custom
tokenizer: standard
filter:
- lowercase
- incremental_filter
managers:
default:
index:
hosts:
- %elastic_host%:%elastic_port%
index_name: index
analysis:
analyzer:
- incrementalAnalyzer
filter:
- incremental_filter
mappings:
- AppBundle
但是我没有得到想要的结果。
任何人都可以帮我吗?过滤器和分析仪之间有什么区别?我正在使用 MultiMatchQuery,因为我想在不同类型的不同字段中进行搜索:
$multiMatchQuery =
new MultiMatchQuery(
[
'name^12',
'product_name^8',
'itemno^18',
'number^7',
'category^6',
'company^4',
'motor^3',
'chassis^13',
'engine^14',
'description'
],
$term
);
$search->addQuery($multiMatchQuery);
我还尝试定义 "not_analyzed" 个字段。
希望得到您的帮助!
谢谢。
bundle 配置表示 elasticsearch 映射。在分析部分,您可以定义分析器,您可以在单独的管理器中重用它们。
过滤器和分析器的区别在于过滤器是在分析器链中使用的。 Analyzer 包含一系列操作,其中过滤器是其中的一部分,就像标记器、标记过滤器和其他操作一样。这是一篇关于分析器的非常好的文章 https://www.elastic.co/blog/found-text-analysis-part-1
要使搜索随心所欲,我认为您应该使用 ngram 分词器而不是过滤器。 https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html
好的,我找到了解决方案。这是一篇描述问题的文章(特定于德语)https://www.elastic.co/guide/en/elasticsearch/guide/current/ngrams-compound-words.html
因此分析器需要一个 ngram 过滤器(不适用于分词器)。
我也忘记了用分析器指定 属性 。现在它起作用了。
ongr_elasticsearch:
analysis:
analyzer:
my_ngram_analyzer:
type: custom
tokenizer: standard
filter:
- lowercase
- my_ngram_filter
filter:
my_ngram_filter:
type: ngram
min_gram: 2
max_gram: 8
managers:
default:
index:
hosts:
- %elastic_host%:%elastic_port%
index_name: index
analysis:
analyzer:
- my_ngram_analyzer
filter:
- my_ngram_filter
mappings:
- AppBundle
并且文档中的 属性 也需要正确定义(对于所有需要的属性)。
/**
* @var string
*
* @ES\Property(name="itemno", type="string", options={"analyzer":"my_ngram_analyzer"})
*/
public $itemno;
我正在为我的 Symfony3 项目使用 https://github.com/ongr-io/ElasticsearchBundle。这个包的原因是,我的项目正在使用 propel。
到目前为止一切正常,运行良好。 但现在我想添加搜索单词子字符串的可能性。例如有一些项目命名为 Test01、Test02、Test03 等,例如,当我尝试搜索 Test 时,我没有得到任何结果。就在我像 Test01.
这样输入整个单词的时候我读过通配符搜索的可能性,但不同的解决方案表示,使用 ngram 或 edge_ngram 会是更好的解决方案。
我试过在配置中指定如下
ongr_elasticsearch:
analysis:
filter:
incremental_filter:
type: edge_ngram
min_gram: 3
max_gram: 10
analyzer:
incrementalAnalyzer:
type: custom
tokenizer: standard
filter:
- lowercase
- incremental_filter
managers:
default:
index:
hosts:
- %elastic_host%:%elastic_port%
index_name: index
analysis:
analyzer:
- incrementalAnalyzer
filter:
- incremental_filter
mappings:
- AppBundle
但是我没有得到想要的结果。 任何人都可以帮我吗?过滤器和分析仪之间有什么区别?我正在使用 MultiMatchQuery,因为我想在不同类型的不同字段中进行搜索:
$multiMatchQuery =
new MultiMatchQuery(
[
'name^12',
'product_name^8',
'itemno^18',
'number^7',
'category^6',
'company^4',
'motor^3',
'chassis^13',
'engine^14',
'description'
],
$term
);
$search->addQuery($multiMatchQuery);
我还尝试定义 "not_analyzed" 个字段。
希望得到您的帮助!
谢谢。
bundle 配置表示 elasticsearch 映射。在分析部分,您可以定义分析器,您可以在单独的管理器中重用它们。
过滤器和分析器的区别在于过滤器是在分析器链中使用的。 Analyzer 包含一系列操作,其中过滤器是其中的一部分,就像标记器、标记过滤器和其他操作一样。这是一篇关于分析器的非常好的文章 https://www.elastic.co/blog/found-text-analysis-part-1
要使搜索随心所欲,我认为您应该使用 ngram 分词器而不是过滤器。 https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html
好的,我找到了解决方案。这是一篇描述问题的文章(特定于德语)https://www.elastic.co/guide/en/elasticsearch/guide/current/ngrams-compound-words.html
因此分析器需要一个 ngram 过滤器(不适用于分词器)。 我也忘记了用分析器指定 属性 。现在它起作用了。
ongr_elasticsearch:
analysis:
analyzer:
my_ngram_analyzer:
type: custom
tokenizer: standard
filter:
- lowercase
- my_ngram_filter
filter:
my_ngram_filter:
type: ngram
min_gram: 2
max_gram: 8
managers:
default:
index:
hosts:
- %elastic_host%:%elastic_port%
index_name: index
analysis:
analyzer:
- my_ngram_analyzer
filter:
- my_ngram_filter
mappings:
- AppBundle
并且文档中的 属性 也需要正确定义(对于所有需要的属性)。
/**
* @var string
*
* @ES\Property(name="itemno", type="string", options={"analyzer":"my_ngram_analyzer"})
*/
public $itemno;