首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASP.NET中的Elastic Search -使用与号

ASP.NET中的Elastic Search -使用与号
EN

Stack Overflow用户
提问于 2019-03-15 18:34:36
回答 1查看 110关注 0票数 0

我是ASP.NET中的弹性搜索的新手,我有一个问题,到目前为止,我还无法解决。

从文档中,我已经看到&符号并没有被列为特殊字符。然而,当我提交我的搜索时,我的&符号被完全忽略了。例如,如果我搜索procter & gamble& sign将被完全忽略。这给我带来了很多问题,因为我的公司都有像M&S这样的名字。当&符号被忽略时,我基本上得到了其中包含M或S的所有内容。如果我尝试使用精确搜索(M&S),我也会遇到同样的问题。

我的代码是:

代码语言:javascript
复制
void Connect()
{            
    node = new Uri(ConfigurationManager.AppSettings["Url"]);
    settings = new ConnectionSettings(node);
    settings.DefaultIndex(ConfigurationManager.AppSettings["defaultIndex"]);
    settings.ThrowExceptions(true);
    client = new ElasticClient(settings);                        
}

private string escapeChars(string inStr) {
    var temp = inStr;
    temp = temp
        .Replace(@"\", @"\\")
        .Replace(@">",string.Empty)
        .Replace(@"<",string.Empty)
        .Replace(@"{",string.Empty)
        .Replace(@"}",string.Empty)
        .Replace(@"[",string.Empty)
        .Replace(@"]",string.Empty)
        .Replace(@"*",string.Empty)
        .Replace(@"?",string.Empty)
        .Replace(@":",string.Empty)
        .Replace(@"/",string.Empty);
    return temp;
}

然后在我的一个函数中

代码语言:javascript
复制
Connect();    
ISearchResponse<ElasticSearch_Result> search_result;            
var QString = escapeChars(searchString);                  
search_result = client.Search<ElasticSearch_Result>(s => s
    .From(0)
    .Size(101)
    .Query(q => 
        q.QueryString(b => 
            b.Query(QString)
            //.Analyzer("whitespace")
            .Fields(fs => fs.Field(f => f.CompanyName))                                
        )
    )
    .Highlight(h => h
        .Order("score")
        .TagsSchema("styled")
        .Fields(fs => fs
            .Field(f => f.CompanyName)
        )
    )
);

我尝试过包含分析器,但后来我发现它们改变了标记器split单词的方式。我还无法实现对记号赋予器的更改。

我希望能够有以下场景:

搜索:M&S Company Foo Bar

令牌:M&S Company Foo Bar +奖励是如果也有M S令牌的话

我使用的是elastic search V5.0。

任何帮助都非常受欢迎。包括比这里找到的更好的文档:https://www.elastic.co/guide/en/elasticsearch/client/net-api/5.x/writing-queries.html

EN

Stack Overflow用户

发布于 2019-03-15 22:07:14

默认情况下,对于文本字段,应用的分析器是standard analyzer。此分析器将standard tokenizerlowercase token filter一起应用。因此,当您根据该字段对某些值进行索引时,将对该值应用标准分析器,并根据该字段对生成的标记进行索引。

让我们通过字段companyName (文本类型)来理解这一点,让我们假设在索引文档时传递的值是M&S Company Foo Bar。应用标准分析器后,该值的结果标记将为:

代码语言:javascript
复制
m
s
company
foo
bar

您可以注意到,不仅使用空格,还使用&作为分隔符,以拆分和生成标记。

当您对该字段进行查询并且没有在搜索查询中传递任何分析器时,默认情况下,它也会应用相同的分析器进行搜索,该分析器也应用于对该字段进行索引。因此,如果搜索M&S,它将被标记为MS,因此实际的搜索查询将搜索这两个标记,而不是M&S

要解决这个问题,您需要更改字段companyName的分析器。除了标准分析器,您还可以创建一个使用whitespace tokenizer和小写筛选器的自定义分析器(以使搜索不区分大小写)。为此,需要更改设置和映射,如下所示:

代码语言:javascript
复制
{
  "settings": {
    "analysis": {
      "analyzer": {
        "whitespace_lowercase": {
          "tokenizer": "whitespace",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "companyName": {
          "type": "text",
          "analyzer": "whitespace_lowercase",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

现在,对于上面的输入,生成的标记将是:

代码语言:javascript
复制
m&s
company
foo
bar

这将确保在搜索M&S时不会忽略&

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55180647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档