Skip to content

Commit f9f8941

Browse files
authored
chore: Default search is fuzzy (#136)
1 parent 54d2190 commit f9f8941

File tree

3 files changed

+46
-17
lines changed

3 files changed

+46
-17
lines changed

src/SearchEngine/Masa.Contrib.SearchEngine.AutoComplete.ElasticSearch/AutoCompleteClient.cs

+7-1
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,16 @@ public override async Task<GetResponse<TAudoCompleteDocument, TValue>> GetAsync<
2929
var searchType = newOptions.SearchType ?? _defaultSearchType;
3030
if (searchType == SearchType.Fuzzy)
3131
{
32+
string newKeyword = keyword;
33+
if (!newKeyword.StartsWith("*"))
34+
newKeyword = "*" + newKeyword;
35+
if (!newKeyword.EndsWith("*"))
36+
newKeyword = newKeyword + "*";
37+
3238
var ret = await _client.GetPaginatedListAsync(
3339
new PaginatedOptions<TAudoCompleteDocument>(
3440
_indexName,
35-
keyword,
41+
newKeyword,
3642
newOptions.Field,
3743
newOptions.Page,
3844
newOptions.PageSize,

src/SearchEngine/Masa.Contrib.SearchEngine.AutoComplete.ElasticSearch/Options/AutoCompleteOptions.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ public class AutoCompleteOptions<TDocument, TValue>
1212

1313
internal bool IsDefault { get; private set; }
1414

15-
internal SearchType DefaultSearchType { get; private set; } = SearchType.Precise;
15+
internal SearchType DefaultSearchType { get; private set; } = SearchType.Fuzzy;
1616

17-
internal Operator DefaultOperator { get; private set; } = Operator.And;
17+
internal Operator DefaultOperator { get; private set; } = Operator.Or;
1818

1919
internal Action<TypeMappingDescriptor<TDocument>>? Action { get; private set; }
2020

test/Masa.Contrib.SearchEngine.AutoComplete.ElasticSearch.Tests/AutoCompleteTest.cs

+37-14
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ public void Initialize()
1818
public void TestAddAutoCompleteAndNoIndexName()
1919
{
2020
var builder = _services.AddElasticsearchClient();
21-
Assert.ThrowsException<ArgumentNullException>(() => builder.AddAutoComplete<Guid>());
21+
Assert.ThrowsException<ArgumentNullException>(()
22+
=> builder.AddAutoComplete<Guid>(option => option.UseDefaultSearchType(SearchType.Precise).UseDefaultOperator(Operator.And)));
2223
}
2324

2425
[TestMethod]
@@ -30,7 +31,7 @@ public void TestAddAutoComplete()
3031
{
3132
setting.DefaultIndex("user_index");
3233
});
33-
}).AddAutoComplete();
34+
}).AddAutoComplete(option => option.UseDefaultSearchType(SearchType.Precise).UseDefaultOperator(Operator.And));
3435
var serviceProvider = _services.BuildServiceProvider();
3536
var autoCompleteClient = serviceProvider.GetService<IAutoCompleteClient>();
3637
Assert.IsNotNull(autoCompleteClient);
@@ -53,8 +54,11 @@ public void TestAddMultiAutoComplete()
5354

5455
var builder = _services
5556
.AddElasticsearchClient("es", option => option.UseNodes("http://localhost:9200").UseDefault())
56-
.AddAutoComplete(option => option.UseIndexName(userIndexName).UseAlias(userAlias));
57-
Assert.ThrowsException<ArgumentException>(() => builder.AddAutoComplete(option => option.UseIndexName(userIndexName)));
57+
.AddAutoComplete(option
58+
=> option.UseIndexName(userIndexName).UseAlias(userAlias).UseDefaultSearchType(SearchType.Precise)
59+
.UseDefaultOperator(Operator.And));
60+
Assert.ThrowsException<ArgumentException>(() => builder.AddAutoComplete(option
61+
=> option.UseIndexName(userIndexName).UseDefaultSearchType(SearchType.Precise).UseDefaultOperator(Operator.And)));
5862
}
5963

6064
[TestMethod]
@@ -65,9 +69,13 @@ public void TestAddMultiDefaultAutoComplete()
6569

6670
var builder = _services
6771
.AddElasticsearchClient("es", option => option.UseNodes("http://localhost:9200").UseDefault())
68-
.AddAutoComplete(option => option.UseIndexName(userIndexName).UseAlias(userAlias).UseDefault());
72+
.AddAutoComplete(option
73+
=> option.UseIndexName(userIndexName).UseAlias(userAlias).UseDefault().UseDefaultSearchType(SearchType.Precise)
74+
.UseDefaultOperator(Operator.And));
6975
Assert.ThrowsException<ArgumentException>(()
70-
=> builder.AddAutoComplete(option => option.UseIndexName("employee_index").UseDefault()));
76+
=> builder.AddAutoComplete(option
77+
=> option.UseIndexName("employee_index").UseDefault().UseDefaultSearchType(SearchType.Precise)
78+
.UseDefaultOperator(Operator.And)));
7179
}
7280

7381
[TestMethod]
@@ -82,7 +90,8 @@ public async Task TestGetAsync()
8290
await builder.Client.DeleteIndexByAliasAsync(userAlias);
8391

8492
builder.AddAutoComplete<long>(option
85-
=> option.UseIndexName(userIndexName).UseAlias(userAlias).UseDefaultSearchType(SearchType.Precise));
93+
=> option.UseIndexName(userIndexName).UseAlias(userAlias).UseDefaultSearchType(SearchType.Precise)
94+
.UseDefaultOperator(Operator.And));
8695

8796
var autoCompleteFactory = builder.Services.BuildServiceProvider().GetRequiredService<IAutoCompleteFactory>();
8897
var autoCompleteClient = autoCompleteFactory.CreateClient(userIndexName);
@@ -133,6 +142,8 @@ public async Task TestCustomModelAsync()
133142
builder.AddAutoComplete<Employee, int>(option => option
134143
.UseIndexName(employeeIndexName)
135144
.UseAlias(employeeAlias)
145+
.UseDefaultSearchType(SearchType.Precise)
146+
.UseDefaultOperator(Operator.And)
136147
.Mapping(descriptor =>
137148
{
138149
descriptor.AutoMap<Employee>()
@@ -229,7 +240,9 @@ public async Task TestPreciseAsync()
229240
await builder.Client.DeleteIndexByAliasAsync(employeeAlias);
230241
builder.AddAutoComplete<Employee, int>(option => option
231242
.UseIndexName(employeeIndexName)
232-
.UseAlias(employeeAlias));
243+
.UseAlias(employeeAlias)
244+
.UseDefaultSearchType(SearchType.Precise)
245+
.UseDefaultOperator(Operator.And));
233246

234247
var autoCompleteFactory = builder.Services.BuildServiceProvider().GetRequiredService<IAutoCompleteFactory>();
235248
var employeeClient = autoCompleteFactory.CreateClient(employeeAlias);
@@ -272,7 +285,7 @@ public async Task TestOperatorAndAsync()
272285
.AddElasticsearchClient("es", option => option.UseNodes("http://localhost:9200").UseDefault())
273286
.AddAutoComplete<long>(option =>
274287
option.UseIndexName(userIndexName)
275-
.UseAlias(userAlias));
288+
.UseAlias(userAlias).UseDefaultSearchType(SearchType.Precise).UseDefaultOperator(Operator.And));
276289

277290
await builder.Client.ClearDocumentAsync(userAlias);
278291

@@ -312,7 +325,7 @@ public async Task TestOperatorOrAsync()
312325
builder.AddAutoComplete<long>(option =>
313326
option.UseIndexName(userIndexName)
314327
.UseAlias(userAlias)
315-
.UseDefaultOperator(Operator.Or));
328+
.UseDefaultOperator(Operator.Or).UseDefaultSearchType(SearchType.Precise));
316329

317330
var autoCompleteFactory = builder.Services.BuildServiceProvider().GetRequiredService<IAutoCompleteFactory>();
318331
var autoCompleteClient = autoCompleteFactory.CreateClient(userAlias);
@@ -344,6 +357,8 @@ public void TestNullIndexName()
344357
string analyzer = "ik_max_word_pinyin";
345358

346359
Assert.ThrowsException<ArgumentNullException>(() => builder.AddAutoComplete<Employee, int>(option => option
360+
.UseDefaultSearchType(SearchType.Precise)
361+
.UseDefaultOperator(Operator.And)
347362
.Mapping(descriptor =>
348363
{
349364
descriptor.AutoMap<Employee>()
@@ -376,7 +391,9 @@ public async Task DeleteAsyncReturnDocumentIsNotExist()
376391
var builder = _services.AddElasticsearchClient("es", option => option.UseNodes("http://localhost:9200").UseDefault());
377392
await builder.Client.DeleteIndexAsync(userIndexName);
378393

379-
builder.AddAutoComplete(option => option.UseIndexName(userIndexName).UseAlias(userAlias));
394+
builder.AddAutoComplete(option
395+
=> option.UseIndexName(userIndexName).UseAlias(userAlias).UseDefaultSearchType(SearchType.Precise)
396+
.UseDefaultOperator(Operator.And));
380397
var serviceProvider = builder.Services.BuildServiceProvider();
381398
var autoCompleteClient = serviceProvider.GetRequiredService<IAutoCompleteClient>();
382399
await autoCompleteClient.SetAsync(new AutoCompleteDocument<long>[]
@@ -406,7 +423,9 @@ public async Task DeleteAsyncReturnDeleteSuccess()
406423
var builder = _services.AddElasticsearchClient("es", option => option.UseNodes("http://localhost:9200").UseDefault());
407424
await builder.Client.DeleteIndexAsync(userIndexName);
408425

409-
builder.AddAutoComplete(option => option.UseIndexName(userIndexName).UseAlias(userAlias));
426+
builder.AddAutoComplete(option
427+
=> option.UseIndexName(userIndexName).UseAlias(userAlias).UseDefaultSearchType(SearchType.Precise)
428+
.UseDefaultOperator(Operator.And));
410429
var serviceProvider = builder.Services.BuildServiceProvider();
411430
var autoCompleteClient = serviceProvider.GetRequiredService<IAutoCompleteClient>();
412431
await autoCompleteClient.SetAsync(new AutoCompleteDocument<long>[]
@@ -437,7 +456,9 @@ public async Task DeleteUserReturnEmpty()
437456
var builder = _services.AddElasticsearchClient("es", option => option.UseNodes("http://localhost:9200").UseDefault());
438457
await builder.Client.DeleteIndexAsync(userIndexName);
439458

440-
builder.AddAutoComplete(option => option.UseIndexName(userIndexName).UseAlias(userAlias));
459+
builder.AddAutoComplete(option
460+
=> option.UseIndexName(userIndexName).UseAlias(userAlias).UseDefaultSearchType(SearchType.Precise)
461+
.UseDefaultOperator(Operator.And));
441462
var serviceProvider = builder.Services.BuildServiceProvider();
442463
var autoCompleteClient = serviceProvider.GetRequiredService<IAutoCompleteClient>();
443464
await autoCompleteClient.SetAsync(new AutoCompleteDocument<long>[]
@@ -477,7 +498,9 @@ public async Task DeleteMultiUserReturnEmpty()
477498
var builder = _services.AddElasticsearchClient("es", option => option.UseNodes("http://localhost:9200").UseDefault());
478499
await builder.Client.DeleteIndexAsync(userIndexName);
479500

480-
builder.AddAutoComplete(option => option.UseIndexName(userIndexName).UseAlias(userAlias));
501+
builder.AddAutoComplete(option
502+
=> option.UseIndexName(userIndexName).UseAlias(userAlias).UseDefaultSearchType(SearchType.Precise)
503+
.UseDefaultOperator(Operator.And));
481504
var serviceProvider = builder.Services.BuildServiceProvider();
482505
var autoCompleteClient = serviceProvider.GetRequiredService<IAutoCompleteClient>();
483506
await autoCompleteClient.SetAsync(new AutoCompleteDocument<long>[]

0 commit comments

Comments
 (0)