使用ElasticSearchNest精确匹配短语

0h4hbjxa  于 2023-01-04  发布在  ElasticSearch
关注(0)|答案(1)|浏览(185)

我使用Nest来构建一个查询,我有一个名为Event的类,它有一个名为Location的属性和一个名为Address的属性(一个字符串),所以索引看起来像这样:

"id" : "something1",
"location": {
    "address": "The Club",
}

"id" : "something2",
"location": {
    "address": "The Hole",
}

我想创建一个查询,其中用户键入“The Club”(位置变量),它只检索第一个以“The Club”作为地址的项目
这是我当前的查询

var skip = (page - 1) * rows;
  var searchResponse = await _elasticClient.SearchAsync<Event>(s => s
            .From(skip)
            .Size(rows)
            .Query(q => q
                .QueryString(qs => qs
                    .Fields(fields => fields
                        .Field(f => f.Location.Address)
                    )
                    .Analyzer("keyword")
                    .Query("*" + (location ?? string.Empty) + "*")
                )
            ));

当前,查询检索这两个对象,因为它找到了“The”。我需要添加一些东西到我的索引之前或我应该做什么?
我在创建索引时添加了这个,但它没有任何效果

client.Indices.Create(eventsIndex, c => c.Map<Event>(m => m
        .Properties(p => p
            .Text(t => t
                .Name(n => n.Location.Address)
                    .Analyzer("keyword"))
            )
        ));
iklwldmw

iklwldmw1#

我有两个建议:
1 -添加stop filter(默认语言英语),这样你就不会产生像“the”这样的单词,所有的停用词都会被删除。现在你只需要匹配“hotel”,“the”会被过滤掉。

POST _analyze
{
  "tokenizer": "standard",
  "filter": ["stop"], 
  "text": ["the hotel"]
}

托肯

{
  "tokens": [
    {
      "token": "hotel",
      "start_offset": 4,
      "end_offset": 9,
      "type": "<ALPHANUM>",
      "position": 1
    }
  ]
}

2 -在查询字符串查询中使用default_operator AND。

相关问题