elasticsearch,Lucene,elasticsearch" /> elasticsearch,Lucene,elasticsearch" />

Lucene 在Elasticsearch中使用通配符和必需运算符

Lucene 在Elasticsearch中使用通配符和必需运算符,lucene,elasticsearch,Lucene,elasticsearch,我们的Elasticsearch索引中有各种包含文本的行 “…2%牛奶…” 用户在搜索字段中输入“2%牛奶”之类的查询,我们在内部将其转换为查询 title:(+milk* +2%*) 因为所有条款都是必需的,我们可能对包含“2%乳脂”的行感兴趣 上面的查询返回零命中率。将查询更改为 title:(+milk* +2%) 返回合理的结果。那么为什么第一个查询中的“*”运算符不起作用呢?除非设置映射,否则“%”符号将在标记化过程中被删除。基本上,“2%牛奶”将变成代币2和milk 当您搜索“2

我们的Elasticsearch索引中有各种包含文本的行

“…2%牛奶…”

用户在搜索字段中输入“2%牛奶”之类的查询,我们在内部将其转换为查询

title:(+milk* +2%*)
因为所有条款都是必需的,我们可能对包含“2%乳脂”的行感兴趣

上面的查询返回零命中率。将查询更改为

title:(+milk* +2%)

返回合理的结果。那么为什么第一个查询中的“*”运算符不起作用呢?

除非设置映射,否则“%”符号将在标记化过程中被删除。基本上,“2%牛奶”将变成代币
2
milk

当您搜索“2%*”时,它会查找如下令牌:
2%
2%a
2%b
,等等。。。并且不匹配任何索引标记,不提供命中率

当您搜索“2%”时,它将经历与索引时相同的标记化过程(您可以指定此过程,但默认标记化是相同的),并且您将查找与标记
2
匹配的文档,这将给您一个点击

您可以并且可以通过以下方式设置所需的分析:


祝你好运

前缀和通配符查询似乎不会将分析器应用于其内容。举几个例子:

  • 标题:(+milk*+2%)
    -->
    +标题:milk*+title:2
  • 标题:(+milk*+2%*)
    -->
    +标题:milk*+title:2%*
  • title:(+milk*+2%3)
    -->
    +title:milk*+(title:2 title:3)
  • 标题:(+milk*+2%3*)
    -->
    +标题:milk*+title:2%3*
  • +标题:超级\\-牛奶
    -->
    +标题:超级标题:牛奶
  • +标题:超级牛奶*
    -->
    +标题:超级牛奶*

防止通配符查询的标记化确实有一定意义,因为不允许通配符短语查询。如果允许标记化,这似乎是一个问题,特别是对于嵌入的通配符,通配符可以跨越多少个术语。

您的第一行将
2%
更改为
2
,因此必须进行一些分析?也许我有点困惑……是的,在第一行中,
2%
查询没有使用任何通配符,因此正在进行分析。在第二个字段中有一个通配符,因此没有对该字段进行分析。啊,我现在明白你的意思了。。。对不起,误会了!