我有一个记录数据库,每个记录都有一个right
和一个left
字段,这两个字段都包含文本。数据库使用Elasticsearch进行索引。
我想搜索这些记录的两个字段,并查找包含任何字段的两个或更多字段中包含某些前缀的记录。搜索应该足够具体,只能查找查询中包含所有字词的记录,而不仅仅是其中的一些。
例如,查询 qui bro 应该返回包含句子的记录快速棕色狐狸跳过懒狗,但不包含句子 >快速狐狸跳过懒狗
我已经看过如何perform prefix queries with Elasticsearch的描述(并且可以在一个字段中搜索一个单词时重现它)。
我还看到了如何perform multi-match queries一次搜索多个字段的说明。
但我需要的是这些技术的一些组合,这将允许我同时搜索几个字段,并只查看单词的部分。并且只获取那些包含查询中包含其所有部分的单词的记录。
我该怎么做?任何方法都可以(前缀,ngrams,等等)。
(PS:我的问题可能在某种程度上与this one重复,但由于它从未得到回答,我希望我不会因为询问我而违反任何规则。 )
======================================
更新:
哦,我可能有问题的第一部分。以下是我的Rails应用程序中使用的语法(使用elasticsearch-rails gem):
response = Paragraph.search query: {bool: { must: [ { prefix: {right: "qui"}}, {prefix: {right: "bro"}} ] } }
或者,用纯Elasticsearch语法重写它:
{
"bool": {
"must": [
{ "prefix": { "right": "qui" }},
{ "prefix": { "right": "bro" }}
]
}
}
所以我现在更新的问题是如何将此前缀搜索与multi_match搜索相结合(以便在right
和left
字段中进行搜索。
答案 0 :(得分:1)
好的,这是一个似乎有效的答案。代码必须在多个字段中搜索几个不完整的单词,并仅返回包含所有这些单词的记录。
以下是用elasticsearch-rails语法编写的请求:
response = Paragraph.search query: {bool: { must: [ { multi_match: { query: "qui", type: "phrase_prefix", fields: ["right", "left"]}}, { multi_match: { query: "brow", type: "phrase_prefix", fields: ["right", "left"]}}]}}
或者,用Elasticsearch网站上使用的语法重写:
{query:
{bool:
{ must:
[
{ multi_match:
{
query: "qui",
type: "phrase_prefix",
fields: ["right", "left"]
}
},
{ multi_match:
{
query: "brow",
type: "phrase_prefix",
fields: ["right", "left"]
}
}
]
}
}
}
这似乎有效。但如果有人有其他解决方案(特别是如果这些解决方案会使搜索不区分大小写),我会很高兴听到它们。