elasticsearch Elasticsearch使用AND运算符进行多匹配查询,查找由断字\u分解器令牌筛选器生成的令牌
我使用德语,并遵循文档中提到的示例。到现在为止,一直都还不错。它起作用了!。文本
elasticsearch Elasticsearch使用AND运算符进行多匹配查询,查找由断字\u分解器令牌筛选器生成的令牌,
elasticsearch,lucene,
elasticsearch,Lucene,我使用德语,并遵循文档中提到的示例。到现在为止,一直都还不错。它起作用了!。文本kaffeetasse被标记为kaffee和tasse 当我使用对kaffeetasse的多匹配查询来查找kaffee和tasse都匹配的文档时,出现了问题。在多匹配查询中,似乎多匹配使用或作为连字号分解器过滤器生成的标记,而不是给定的运算符(“AND”)。这是我的测试用例 映射 curl -XPUT "http://localhost:9200/testidx" -H 'Content-Type
kaffeetasse
被标记为kaffee
和tasse
当我使用对kaffeetasse的多匹配查询来查找kaffee和tasse都匹配的文档时,出现了问题。在多匹配查询中,似乎多匹配使用或作为连字号分解器过滤器生成的标记,而不是给定的运算符(“AND”)。这是我的测试用例
映射
curl -XPUT "http://localhost:9200/testidx" -H 'Content-Type: application/json' -d'{ "settings": { "index": { "analysis": { "analyzer": { "index": { "type" : "custom", "tokenizer": "whitespace", "filter": [ "lowercase" ] }, "search": { "type" : "custom", "tokenizer": "whitespace", "filter": [ "lowercase", "hyph" ] } }, "filter": { "hyph": { "type": "hyphenation_decompounder", "hyphenation_patterns_path": "analysis/de_DR.xml", "word_list": ["kaffee", "zucker", "tasse"], "only_longest_match": true, "min_subword_size": 4 } } } } }, "mappings" : { "properties" : { "title" : { "type" : "text", "analyzer": "index", "search_analyzer": "search" }, "description" : { "type" : "text", "analyzer": "index", "search_analyzer": "search" } } } }'
文档id=1
curl -XPOST "http://localhost:9200/testidx/_doc/1" -H 'Content-Type: application/json' -d'{ "title" : "Kaffee", "description": "Milch Kaffee tasse"}'
文档id=2
curl -XPOST "http://localhost:9200/testidx/_doc/2" -H 'Content-Type: application/json' -d'{ "title" : "Kaffee", "description": "Latte Kaffee Becher"}'
多匹配查询
curl -XGET "http://localhost:9200/testidx/_search" -H 'Content-Type: application/json' -d'{ "query": { "multi_match": { "query": "kaffeetasse", "fields": ["title", "description"], "operator": "and", "type": "cross_fields", "analyzer": "search" } }}'
我的期望是elasticsearch应该只返回id=1的单个文档,就像它在其字段中有kaffee
和tasse
一样,但它返回两个文档时都有kaffee
或tasse
文本
弹性搜索:7.9.2
de_DR.xml
从下载,如文档中所述。Elasticsearch返回这两个文档,因为它将运算符参数应用于原始查询kaffeetasse
,而不是analyzer生成的令牌kaffee
和tasse
。formatch
query中描述的此类行为:
运算符(可选,字符串)布尔逻辑,用于解释查询
值中的文本
由于原始查询是一个单词,运算符
参数没有意义
作为一种解决方法,您可以分两步执行搜索:
使用以下命令分析原始查询字符串:
使用从search
analyzer收到的令牌作为multi_match
查询的单词,并将操作符
参数设置为和
,将analyzer
参数设置为空白
(以防止已分析的令牌被search
analyzer再次分析):
我担心执行步骤1的往返过程会花费额外的时间。我在考虑提取Lucene断字解压器功能,并在将查询发送到Elasticsearch之前对其进行预处理。同样的问题。我们正在进行一项电子商务搜索,搜索中使用了像Tablethalterung
这样的英语单词。为了解决这个问题,我们使用了一个特定于领域的单词列表,该列表将丹格利什复合词拆分为correct。但是结果是无用的,因为我们得到了所有包含tablet
或halter
的文档,而不是tablet和halter,我们当前基于ES 2 handels的搜索结果与预期一致。你找到解决方案了吗?@ThomasHaarbach,还没有找到任何基于Elasticsearch的解决方案。到目前为止,在发送到ES之前使用Lucene断字分解器对查询进行标记似乎是一个可行的解决方法。嗯,这是可行的。我试过es analysies往返,结果也很糟糕,因为原始术语在令牌流中,例如[kaffeetasse,kaffee,tasse]。打开这个话题
curl -XGET "http://localhost:9200/testidx/_analyze" -H 'Content-Type: application/json' -d'{"analyzer": "search", "text": "kaffeetasse"}'
curl -XGET "http://localhost:9200/testidx/_search" -H 'Content-Type: application/json' -d'{ "query": {"multi_match": {"query": "kaffee tasse", "fields": ["title", "description"], "operator": "and", "type": "cross_fields", "analyzer": "whitespace"}}}'