github.com/ravendb/ravendb-go-client@v0.0.0-20240229102137-4474ee7aa0fa/tests/more_like_this_test.go (about) 1 package tests 2 3 import ( 4 "fmt" 5 "math/rand" 6 "strings" 7 "testing" 8 9 ravendb "github.com/ravendb/ravendb-go-client" 10 "github.com/stretchr/testify/assert" 11 ) 12 13 func getLorem(numWords int) string { 14 theLorem := "Morbi nec purus eu libero interdum laoreet Nam metus quam posuere in elementum eget egestas eget justo Aenean orci ligula ullamcorper nec convallis non placerat nec lectus Quisque convallis porta suscipit Aliquam sollicitudin ligula sit amet libero cursus egestas Maecenas nec mauris neque at faucibus justo Fusce ut orci neque Nunc sodales pulvinar lobortis Praesent dui tellus fermentum sed faucibus nec faucibus non nibh Vestibulum adipiscing porta purus ut varius mi pulvinar eu Nam sagittis sodales hendrerit Vestibulum et tincidunt urna Fusce lacinia nisl at luctus lobortis lacus quam rhoncus risus a posuere nulla lorem at nisi Sed non erat nisl Cras in augue velit a mattis ante Etiam lorem dui elementum eget facilisis vitae viverra sit amet tortor Suspendisse potenti Nunc egestas accumsan justo viverra viverra Sed faucibus ullamcorper mauris ut pharetra ligula ornare eget Donec suscipit luctus rhoncus Pellentesque eget justo ac nunc tempus consequat Nullam fringilla egestas leo Praesent condimentum laoreet magna vitae luctus sem cursus sed Mauris massa purus suscipit ac malesuada a accumsan non neque Proin et libero vitae quam ultricies rhoncus Praesent urna neque molestie et suscipit vestibulum iaculis ac nulla Integer porta nulla vel leo ullamcorper eu rhoncus dui semper Donec dictum dui" 15 16 loremArray := strings.Split(theLorem, " ") 17 18 output := "" 19 maxN := len(loremArray) - 1 20 21 for i := 0; i < numWords; i++ { 22 idx := rand.Intn(maxN) 23 s := loremArray[idx] 24 output += s 25 output += " " 26 } 27 return output 28 } 29 30 func getDataList() []*Data { 31 var items []*Data 32 items = append(items, NewData("This is a test. Isn't it great? I hope I pass my test!")) 33 items = append(items, NewData("I have a test tomorrow. I hate having a test")) 34 items = append(items, NewData("Cake is great.")) 35 items = append(items, NewData("This document has the word test only once")) 36 items = append(items, NewData("test")) 37 items = append(items, NewData("test")) 38 items = append(items, NewData("test")) 39 items = append(items, NewData("test")) 40 return items 41 } 42 43 func moreLikeThisCanGetResultsUsingTermVectors(t *testing.T, driver *RavenTestDriver) { 44 var err error 45 store := driver.getDocumentStoreMust(t) 46 defer store.Close() 47 48 var id string 49 dataIndex := NewDataIndex2(true, false) 50 err = dataIndex.Execute(store, nil, "") 51 assert.NoError(t, err) 52 { 53 session := openSessionMust(t, store) 54 list := getDataList() 55 for _, el := range list { 56 err = session.Store(el) 57 assert.NoError(t, err) 58 } 59 err = session.SaveChanges() 60 assert.NoError(t, err) 61 id = session.Advanced().GetDocumentID(list[0]) 62 err = driver.waitForIndexing(store, store.GetDatabase(), 0) 63 assert.NoError(t, err) 64 } 65 66 moreLikeThisAssertMoreLikeThisHasMatchesFor(t, dataIndex, store, id) 67 } 68 69 func moreLikeThisCanGetResultsUsingTermVectorsLazy(t *testing.T, driver *RavenTestDriver) { 70 var err error 71 store := driver.getDocumentStoreMust(t) 72 defer store.Close() 73 74 var id string 75 dataIndex := NewDataIndex2(true, false) 76 77 { 78 session := openSessionMust(t, store) 79 err = dataIndex.Execute(store, nil, "") 80 assert.NoError(t, err) 81 list := getDataList() 82 for _, el := range list { 83 err = session.Store(el) 84 assert.NoError(t, err) 85 } 86 err = session.SaveChanges() 87 assert.NoError(t, err) 88 id = session.Advanced().GetDocumentID(list[0]) 89 err = driver.waitForIndexing(store, store.GetDatabase(), 0) 90 assert.NoError(t, err) 91 } 92 { 93 session := openSessionMust(t, store) 94 options := ravendb.NewMoreLikeThisOptions() 95 options.Fields = []string{"body"} 96 97 query := session.QueryIndex(dataIndex.IndexName) 98 builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) { 99 builder := func(b *ravendb.DocumentQuery) { 100 b.WhereEquals("id()", id) 101 } 102 ops := f.UsingDocumentWithBuilder(builder) 103 ops.WithOptions(options) 104 } 105 query = query.MoreLikeThisWithBuilder(builder) 106 lazyLst, err := query.Lazily() 107 assert.NoError(t, err) 108 var list []*Data 109 err = lazyLst.GetValue(&list) 110 assert.NoError(t, err) 111 assert.NotEmpty(t, list) 112 // TODO: more precise check that returned the right values 113 } 114 } 115 116 func moreLikeThisCanGetResultsUsingTermVectorsWithDocumentQuery(t *testing.T, driver *RavenTestDriver) { 117 var err error 118 store := driver.getDocumentStoreMust(t) 119 defer store.Close() 120 121 var id string 122 dataIndex := NewDataIndex2(true, false) 123 err = dataIndex.Execute(store, nil, "") 124 assert.NoError(t, err) 125 126 { 127 session := openSessionMust(t, store) 128 list := getDataList() 129 for _, el := range list { 130 err = session.Store(el) 131 assert.NoError(t, err) 132 } 133 err = session.SaveChanges() 134 assert.NoError(t, err) 135 id = session.Advanced().GetDocumentID(list[0]) 136 err = driver.waitForIndexing(store, store.GetDatabase(), 0) 137 assert.NoError(t, err) 138 } 139 { 140 session := openSessionMust(t, store) 141 options := ravendb.NewMoreLikeThisOptions() 142 options.Fields = []string{"body"} 143 query := session.QueryIndex(dataIndex.IndexName) 144 builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) { 145 builder := func(b *ravendb.DocumentQuery) { 146 b.WhereEquals("id()", id) 147 } 148 ops := f.UsingDocumentWithBuilder(builder) 149 ops.WithOptions(options) 150 } 151 query = query.MoreLikeThisWithBuilder(builder) 152 var list []*Data 153 err = query.GetResults(&list) 154 assert.NoError(t, err) 155 assert.NotEmpty(t, list) 156 assert.Equal(t, len(list), 7) 157 // TODO: better check if returned the right result 158 } 159 } 160 161 func moreLikeThisCanGetResultsUsingStorage(t *testing.T, driver *RavenTestDriver) { 162 var err error 163 store := driver.getDocumentStoreMust(t) 164 defer store.Close() 165 166 var id string 167 dataIndex := NewDataIndex2(false, true) 168 err = dataIndex.Execute(store, nil, "") 169 assert.NoError(t, err) 170 171 { 172 session := openSessionMust(t, store) 173 list := getDataList() 174 for _, el := range list { 175 err = session.Store(el) 176 assert.NoError(t, err) 177 } 178 err = session.SaveChanges() 179 assert.NoError(t, err) 180 id = session.Advanced().GetDocumentID(list[0]) 181 err = driver.waitForIndexing(store, store.GetDatabase(), 0) 182 assert.NoError(t, err) 183 } 184 185 moreLikeThisAssertMoreLikeThisHasMatchesFor(t, dataIndex, store, id) 186 } 187 188 func moreLikeThisCanGetResultsUsingTermVectorsAndStorage(t *testing.T, driver *RavenTestDriver) { 189 var err error 190 store := driver.getDocumentStoreMust(t) 191 defer store.Close() 192 193 var id string 194 dataIndex := NewDataIndex2(true, true) 195 err = dataIndex.Execute(store, nil, "") 196 assert.NoError(t, err) 197 198 { 199 session := openSessionMust(t, store) 200 list := getDataList() 201 for _, el := range list { 202 err = session.Store(el) 203 assert.NoError(t, err) 204 } 205 err = session.SaveChanges() 206 assert.NoError(t, err) 207 id = session.Advanced().GetDocumentID(list[0]) 208 err = driver.waitForIndexing(store, store.GetDatabase(), 0) 209 assert.NoError(t, err) 210 } 211 moreLikeThisAssertMoreLikeThisHasMatchesFor(t, dataIndex, store, id) 212 } 213 214 func moreLikeThisTestWithLotsOfRandomData(t *testing.T, driver *RavenTestDriver) { 215 var err error 216 store := driver.getDocumentStoreMust(t) 217 defer store.Close() 218 219 key := "data/1-A" // Note: in Java it's datas/ because of bad pluralization of data 220 dataIndex := NewDataIndex() 221 err = dataIndex.Execute(store, nil, "") 222 assert.NoError(t, err) 223 224 { 225 session := openSessionMust(t, store) 226 for i := 0; i < 100; i++ { 227 data := &Data{} 228 data.Body = getLorem(200) 229 err = session.Store(data) 230 assert.NoError(t, err) 231 } 232 err = session.SaveChanges() 233 assert.NoError(t, err) 234 err = driver.waitForIndexing(store, store.GetDatabase(), 0) 235 assert.NoError(t, err) 236 } 237 moreLikeThisAssertMoreLikeThisHasMatchesFor(t, dataIndex, store, key) 238 } 239 240 func moreLikeThisDoNotPassFieldNames(t *testing.T, driver *RavenTestDriver) { 241 var err error 242 store := driver.getDocumentStoreMust(t) 243 defer store.Close() 244 245 key := "data/1-A" // Note: in Java it's datas/ because of bad pluralization of data 246 dataIndex := NewDataIndex() 247 err = dataIndex.Execute(store, nil, "") 248 assert.NoError(t, err) 249 250 { 251 session := openSessionMust(t, store) 252 for i := 0; i < 10; i++ { 253 data := &Data{} 254 data.Body = fmt.Sprintf("Body%d", i) 255 data.WhitespaceAnalyzerField = "test test" 256 err = session.Store(data) 257 assert.NoError(t, err) 258 259 } 260 err = session.SaveChanges() 261 assert.NoError(t, err) 262 err = driver.waitForIndexing(store, store.GetDatabase(), 0) 263 assert.NoError(t, err) 264 } 265 266 { 267 session := openSessionMust(t, store) 268 query := session.QueryIndex(dataIndex.IndexName) 269 builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) { 270 builder := func(b *ravendb.DocumentQuery) { 271 b.WhereEquals("id()", key) 272 } 273 f.UsingDocumentWithBuilder(builder) 274 } 275 query = query.MoreLikeThisWithBuilder(builder) 276 var list []*Data 277 err = query.GetResults(&list) 278 assert.NoError(t, err) 279 assert.Equal(t, 9, len(list)) // TODO: should this be 10? 1? 280 } 281 } 282 283 func moreLikeThisEachFieldShouldUseCorrectAnalyzer(t *testing.T, driver *RavenTestDriver) { 284 var err error 285 store := driver.getDocumentStoreMust(t) 286 defer store.Close() 287 288 key1 := "data/1-A" // Note: in Java it's datas/ because of bad pluralization of data 289 dataIndex := NewDataIndex() 290 err = dataIndex.Execute(store, nil, "") 291 assert.NoError(t, err) 292 293 { 294 session := openSessionMust(t, store) 295 for i := 0; i < 10; i++ { 296 data := &Data{} 297 data.WhitespaceAnalyzerField = "bob@hotmail.com hotmail" 298 err = session.Store(data) 299 assert.NoError(t, err) 300 301 } 302 err = session.SaveChanges() 303 assert.NoError(t, err) 304 err = driver.waitForIndexing(store, store.GetDatabase(), 0) 305 assert.NoError(t, err) 306 } 307 308 { 309 session := openSessionMust(t, store) 310 options := ravendb.NewMoreLikeThisOptions() 311 v1 := 2 312 options.MinimumTermFrequency = &v1 313 v2 := 5 314 options.MinimumDocumentFrequency = &v2 315 316 query := session.QueryIndex(dataIndex.IndexName) 317 builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) { 318 builder := func(b *ravendb.DocumentQuery) { 319 b.WhereEquals("id()", key1) 320 } 321 o := f.UsingDocumentWithBuilder(builder) 322 o.WithOptions(options) 323 } 324 query = query.MoreLikeThisWithBuilder(builder) 325 var list []*Data 326 err = query.GetResults(&list) 327 assert.NoError(t, err) 328 assert.Empty(t, list) 329 } 330 331 key2 := "data/11-A" // Note: in Java it's datas/ because of bad pluralization of data 332 333 { 334 session := openSessionMust(t, store) 335 err = dataIndex.Execute(store, nil, "") 336 assert.NoError(t, err) 337 for i := 0; i < 10; i++ { 338 data := &Data{} 339 data.WhitespaceAnalyzerField = "bob@hotmail.com bob@hotmail.com" 340 err = session.Store(data) 341 assert.NoError(t, err) 342 343 } 344 err = session.SaveChanges() 345 assert.NoError(t, err) 346 err = driver.waitForIndexing(store, store.GetDatabase(), 0) 347 assert.NoError(t, err) 348 } 349 350 { 351 session := openSessionMust(t, store) 352 353 query := session.QueryIndex(dataIndex.IndexName) 354 builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) { 355 builder := func(b *ravendb.DocumentQuery) { 356 b.WhereEquals("id()", key2) 357 } 358 f.UsingDocumentWithBuilder(builder) 359 } 360 query = query.MoreLikeThisWithBuilder(builder) 361 var list []*Data 362 err = query.GetResults(&list) 363 assert.NoError(t, err) 364 assert.NotEmpty(t, list) 365 } 366 } 367 368 func moreLikeThisCanUseMinDocFreqParam(t *testing.T, driver *RavenTestDriver) { 369 var err error 370 store := driver.getDocumentStoreMust(t) 371 defer store.Close() 372 373 key := "data/1-A" // Note: in Java it's datas/ because of bad pluralization of data 374 dataIndex := NewDataIndex() 375 err = dataIndex.Execute(store, nil, "") 376 assert.NoError(t, err) 377 378 { 379 session := openSessionMust(t, store) 380 d := []string{ 381 "This is a test. Isn't it great? I hope I pass my test!", 382 "I have a test tomorrow. I hate having a test", 383 "Cake is great.", 384 "This document has the word test only once", 385 } 386 for _, text := range d { 387 data := &Data{} 388 data.Body = text 389 err = session.Store(data) 390 assert.NoError(t, err) 391 } 392 err = session.SaveChanges() 393 assert.NoError(t, err) 394 err = driver.waitForIndexing(store, store.GetDatabase(), 0) 395 assert.NoError(t, err) 396 } 397 398 { 399 session := openSessionMust(t, store) 400 options := ravendb.NewMoreLikeThisOptions() 401 options.Fields = []string{"body"} 402 options.SetMinimumDocumentFrequency(2) 403 404 query := session.QueryIndex(dataIndex.IndexName) 405 builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) { 406 builder := func(b *ravendb.DocumentQuery) { 407 b.WhereEquals("id()", key) 408 } 409 o := f.UsingDocumentWithBuilder(builder) 410 o.WithOptions(options) 411 } 412 query = query.MoreLikeThisWithBuilder(builder) 413 var list []*Data 414 err = query.GetResults(&list) 415 assert.NoError(t, err) 416 assert.NotEmpty(t, list) 417 } 418 } 419 420 func moreLikeThisCanUseBoostParam(t *testing.T, driver *RavenTestDriver) { 421 var err error 422 store := driver.getDocumentStoreMust(t) 423 defer store.Close() 424 425 key := "data/1-A" // Note: in Java it's datas/ because of bad pluralization of data 426 dataIndex := NewDataIndex() 427 err = dataIndex.Execute(store, nil, "") 428 assert.NoError(t, err) 429 430 { 431 session := openSessionMust(t, store) 432 d := []string{ 433 "This is a test. it is a great test. I hope I pass my great test!", 434 "Cake is great.", 435 "I have a test tomorrow.", 436 } 437 for _, text := range d { 438 data := &Data{ 439 Body: text, 440 } 441 err = session.Store(data) 442 assert.NoError(t, err) 443 } 444 err = session.SaveChanges() 445 assert.NoError(t, err) 446 err = driver.waitForIndexing(store, store.GetDatabase(), 0) 447 assert.NoError(t, err) 448 } 449 450 { 451 session := openSessionMust(t, store) 452 options := ravendb.NewMoreLikeThisOptions() 453 options.Fields = []string{"body"} 454 options.SetMinimumWordLength(3) 455 options.SetMinimumDocumentFrequency(1) 456 options.SetMinimumTermFrequency(2) 457 options.SetBoost(true) 458 459 query := session.QueryIndex(dataIndex.IndexName) 460 builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) { 461 builder := func(b *ravendb.DocumentQuery) { 462 b.WhereEquals("id()", key) 463 } 464 o := f.UsingDocumentWithBuilder(builder) 465 o.WithOptions(options) 466 } 467 query = query.MoreLikeThisWithBuilder(builder) 468 var list []*Data 469 err = query.GetResults(&list) 470 assert.NoError(t, err) 471 assert.NotEmpty(t, list) 472 assert.Equal(t, list[0].Body, "I have a test tomorrow.") 473 } 474 } 475 476 func moreLikeThisCanUseStopWords(t *testing.T, driver *RavenTestDriver) { 477 var err error 478 store := driver.getDocumentStoreMust(t) 479 defer store.Close() 480 481 key := "data/1-A" // Note: in Java it's datas/ because of bad pluralization of data 482 dataIndex := NewDataIndex() 483 err = dataIndex.Execute(store, nil, "") 484 assert.NoError(t, err) 485 486 { 487 session := openSessionMust(t, store) 488 d := []string{ 489 "This is a test. Isn't it great? I hope I pass my test!", 490 "I should not hit this document. I hope", 491 "Cake is great.", 492 "This document has the word test only once", 493 "test", 494 "test", 495 "test", 496 "test", 497 } 498 for _, text := range d { 499 data := &Data{ 500 Body: text, 501 } 502 err = session.Store(data) 503 assert.NoError(t, err) 504 } 505 506 stopWords := &ravendb.MoreLikeThisStopWords{ 507 ID: "Config/Stopwords", 508 StopWords: []string{"I", "A", "Be"}, 509 } 510 err = session.Store(stopWords) 511 assert.NoError(t, err) 512 513 err = session.SaveChanges() 514 assert.NoError(t, err) 515 err = driver.waitForIndexing(store, store.GetDatabase(), 0) 516 assert.NoError(t, err) 517 } 518 519 { 520 session := openSessionMust(t, store) 521 options := ravendb.NewMoreLikeThisOptions() 522 options.Fields = []string{"body"} 523 options.SetMinimumTermFrequency(2) 524 options.SetMinimumDocumentFrequency(1) 525 options.SetStopWordsDocumentID("Config/Stopwords") 526 527 query := session.QueryIndex(dataIndex.IndexName) 528 builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) { 529 builder := func(b *ravendb.DocumentQuery) { 530 b.WhereEquals("id()", key) 531 } 532 o := f.UsingDocumentWithBuilder(builder) 533 o.WithOptions(options) 534 } 535 query = query.MoreLikeThisWithBuilder(builder) 536 var list []*Data 537 err = query.GetResults(&list) 538 assert.NoError(t, err) 539 assert.Equal(t, len(list), 5) 540 } 541 } 542 543 func moreLikeThisCanMakeDynamicDocumentQueries(t *testing.T, driver *RavenTestDriver) { 544 var err error 545 store := driver.getDocumentStoreMust(t) 546 defer store.Close() 547 548 dataIndex := NewDataIndex() 549 err = dataIndex.Execute(store, nil, "") 550 assert.NoError(t, err) 551 552 { 553 session := openSessionMust(t, store) 554 list := getDataList() 555 for _, el := range list { 556 err = session.Store(el) 557 assert.NoError(t, err) 558 } 559 err = session.SaveChanges() 560 assert.NoError(t, err) 561 562 err = driver.waitForIndexing(store, store.GetDatabase(), 0) 563 assert.NoError(t, err) 564 } 565 566 { 567 session := openSessionMust(t, store) 568 options := ravendb.NewMoreLikeThisOptions() 569 options.Fields = []string{"body"} 570 options.SetMinimumTermFrequency(1) 571 options.SetMinimumDocumentFrequency(1) 572 573 query := session.QueryIndex(dataIndex.IndexName) 574 builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) { 575 o := f.UsingDocument("{ \"body\": \"A test\" }") 576 o.WithOptions(options) 577 } 578 query = query.MoreLikeThisWithBuilder(builder) 579 var list []*Data 580 err = query.GetResults(&list) 581 assert.NoError(t, err) 582 assert.Equal(t, len(list), 7) 583 } 584 } 585 586 func moreLikeThisCanMakeDynamicDocumentQueriesWithComplexProperties(t *testing.T, driver *RavenTestDriver) { 587 var err error 588 store := driver.getDocumentStoreMust(t) 589 defer store.Close() 590 591 dataIndex := NewComplexDataIndex() 592 err = dataIndex.Execute(store, nil, "") 593 assert.NoError(t, err) 594 595 { 596 session := openSessionMust(t, store) 597 598 complexProperty := &ComplexProperty{ 599 Body: "test", 600 } 601 602 complexData := &ComplexData{ 603 Property: complexProperty, 604 } 605 606 err = session.Store(complexData) 607 assert.NoError(t, err) 608 609 err = session.SaveChanges() 610 assert.NoError(t, err) 611 612 err = driver.waitForIndexing(store, store.GetDatabase(), 0) 613 assert.NoError(t, err) 614 } 615 616 { 617 session := openSessionMust(t, store) 618 options := ravendb.NewMoreLikeThisOptions() 619 options.SetMinimumTermFrequency(1) 620 options.SetMinimumDocumentFrequency(1) 621 622 query := session.QueryIndex(dataIndex.IndexName) 623 builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) { 624 o := f.UsingDocument("{ \"Property\": { \"Body\": \"test\" } }") 625 o.WithOptions(options) 626 } 627 query = query.MoreLikeThisWithBuilder(builder) 628 var list []*ComplexData 629 err = query.GetResults(&list) 630 assert.NoError(t, err) 631 assert.Equal(t, len(list), 1) 632 } 633 } 634 635 func moreLikeThisAssertMoreLikeThisHasMatchesFor(t *testing.T, index *ravendb.IndexCreationTask, store *ravendb.DocumentStore, documentKey string) { 636 session := openSessionMust(t, store) 637 638 options := ravendb.NewMoreLikeThisOptions() 639 options.Fields = []string{"body"} 640 641 q := session.QueryIndex(index.IndexName) 642 fn1 := func(b *ravendb.DocumentQuery) { 643 b.WhereEquals("id()", documentKey) 644 } 645 fn2 := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) { 646 f.UsingDocumentWithBuilder(fn1).WithOptions(options) 647 } 648 var data []*Data 649 q = q.MoreLikeThisWithBuilder(fn2) 650 err := q.GetResults(&data) 651 assert.NoError(t, err) 652 assert.True(t, len(data) > 0) 653 654 session.Close() 655 } 656 657 type Identity struct { 658 ID string 659 } 660 661 type Data struct { 662 Identity 663 664 Body string `json:"body"` 665 WhitespaceAnalyzerField string `json:"whitespaceAnalyzerField"` 666 PersonID string `json:"personId"` 667 } 668 669 func NewData(s string) *Data { 670 return &Data{ 671 Body: s, 672 } 673 } 674 675 type DataWithIntegerId struct { 676 Identity 677 Body string `json:"body"` 678 } 679 680 type ComplexData struct { 681 ID string 682 Property *ComplexProperty `json:"property"` 683 } 684 685 type ComplexProperty struct { 686 Body string `json:"body"` 687 } 688 689 func NewDataIndex() *ravendb.IndexCreationTask { 690 return NewDataIndex2(true, false) 691 } 692 693 func NewDataIndex2(termVector bool, store bool) *ravendb.IndexCreationTask { 694 res := ravendb.NewIndexCreationTask("DataIndex") 695 696 // Note: in Java it's docs.Datas because Inflector.pluralize() doesn't 697 // handle 'data' properly and we do 698 res.Map = "from doc in docs.Data select new { doc.body, doc.whitespaceAnalyzerField }" 699 700 res.Analyze("body", "Lucene.Net.Analysis.Standard.StandardAnalyzer") 701 res.Analyze("whitespaceAnalyzerField", "Lucene.Net.Analysis.WhitespaceAnalyzer") 702 703 if store { 704 res.Store("body", ravendb.FieldStorageYes) 705 res.Store("whitespaceAnalyzerField", ravendb.FieldStorageYes) 706 } 707 708 if termVector { 709 res.TermVector("body", ravendb.FieldTermVectorYes) 710 res.TermVector("whitespaceAnalyzerField", ravendb.FieldTermVectorYes) 711 } 712 return res 713 } 714 715 func NewComplexDataIndex() *ravendb.IndexCreationTask { 716 res := ravendb.NewIndexCreationTask("ComplexDataIndex") 717 // Note: In Java it's docs.ComplexDatas due to not pluralizing Data properly 718 res.Map = "from doc in docs.ComplexData select new { doc.property, doc.property.body }" 719 res.Index("body", ravendb.FieldIndexingSearch) 720 return res 721 } 722 723 func TestMoreLikeThis(t *testing.T) { 724 driver := createTestDriver(t) 725 destroy := func() { destroyDriver(t, driver) } 726 defer recoverTest(t, destroy) 727 728 // order matches Java tests 729 moreLikeThisCanUseStopWords(t, driver) 730 moreLikeThisCanUseBoostParam(t, driver) 731 moreLikeThisCanGetResultsUsingTermVectors(t, driver) 732 moreLikeThisCanUseMinDocFreqParam(t, driver) 733 moreLikeThisEachFieldShouldUseCorrectAnalyzer(t, driver) 734 moreLikeThisTestWithLotsOfRandomData(t, driver) 735 moreLikeThisCanMakeDynamicDocumentQueries(t, driver) 736 moreLikeThisCanGetResultsUsingTermVectorsAndStorage(t, driver) 737 moreLikeThisCanGetResultsUsingStorage(t, driver) 738 moreLikeThisCanMakeDynamicDocumentQueriesWithComplexProperties(t, driver) 739 moreLikeThisDoNotPassFieldNames(t, driver) 740 moreLikeThisCanGetResultsUsingTermVectorsLazy(t, driver) 741 moreLikeThisCanGetResultsUsingTermVectorsWithDocumentQuery(t, driver) 742 }