@@ -342,6 +342,140 @@ SELECT 'a:* & nbb:*ac | doo:a* | goo'::tsquery;
342
342
'a':* & 'nbb':*AC | 'doo':*A | 'goo'
343
343
(1 row)
344
344
345
+ SELECT setweight('a:d & b:a & f'::tsquery, 'c');
346
+ setweight
347
+ -------------------------
348
+ 'a':CD & 'b':AC & 'f':C
349
+ (1 row)
350
+
351
+ -- phrase transformation
352
+ SELECT 'a ? (b|c)'::tsquery;
353
+ tsquery
354
+ -----------------------
355
+ 'a' ? 'b' | 'a' ? 'c'
356
+ (1 row)
357
+
358
+ SELECT '(a|b) ? c'::tsquery;
359
+ tsquery
360
+ -----------------------
361
+ 'a' ? 'c' | 'b' ? 'c'
362
+ (1 row)
363
+
364
+ SELECT '(a|b) ? (d|c)'::tsquery;
365
+ tsquery
366
+ -----------------------------------------------
367
+ 'a' ? 'd' | 'b' ? 'd' | 'a' ? 'c' | 'b' ? 'c'
368
+ (1 row)
369
+
370
+ SELECT 'a ? (b&c)'::tsquery;
371
+ tsquery
372
+ -------------------------------
373
+ ( 'a' ? 'b' ) & ( 'a' ? 'c' )
374
+ (1 row)
375
+
376
+ SELECT '(a&b) ? c'::tsquery;
377
+ tsquery
378
+ -------------------------------
379
+ ( 'a' ? 'c' ) & ( 'b' ? 'c' )
380
+ (1 row)
381
+
382
+ SELECT '(a&b) ? (d&c)'::tsquery;
383
+ tsquery
384
+ ---------------------------------------------------------------
385
+ ( 'a' ? 'd' ) & ( 'b' ? 'd' ) & ( 'a' ? 'c' ) & ( 'b' ? 'c' )
386
+ (1 row)
387
+
388
+ SELECT 'a ? !b'::tsquery;
389
+ tsquery
390
+ ----------------------
391
+ 'a' & !( 'a' ? 'b' )
392
+ (1 row)
393
+
394
+ SELECT '!a ? b'::tsquery;
395
+ tsquery
396
+ ----------------------
397
+ !( 'a' ? 'b' ) & 'b'
398
+ (1 row)
399
+
400
+ SELECT '!a ? !b'::tsquery;
401
+ tsquery
402
+ ----------------------------------
403
+ !'a' & !( !( 'a' ? 'b' ) & 'b' )
404
+ (1 row)
405
+
406
+ SELECT 'a ? !(b&c)'::tsquery;
407
+ tsquery
408
+ ------------------------------------------
409
+ 'a' & !( ( 'a' ? 'b' ) & ( 'a' ? 'c' ) )
410
+ (1 row)
411
+
412
+ SELECT 'a ? !(b|c)'::tsquery;
413
+ tsquery
414
+ ----------------------------------
415
+ 'a' & !( 'a' ? 'b' | 'a' ? 'c' )
416
+ (1 row)
417
+
418
+ SELECT '!(a&b) ? c'::tsquery;
419
+ tsquery
420
+ ------------------------------------------
421
+ !( ( 'a' ? 'c' ) & ( 'b' ? 'c' ) ) & 'c'
422
+ (1 row)
423
+
424
+ SELECT '!(a|b) ? c'::tsquery;
425
+ tsquery
426
+ ----------------------------------
427
+ !( 'a' ? 'c' | 'b' ? 'c' ) & 'c'
428
+ (1 row)
429
+
430
+ SELECT '(!a|b) ? c'::tsquery;
431
+ tsquery
432
+ ----------------------------------
433
+ !( 'a' ? 'c' ) & 'c' | 'b' ? 'c'
434
+ (1 row)
435
+
436
+ SELECT '(!a&b) ? c'::tsquery;
437
+ tsquery
438
+ --------------------------------------
439
+ !( 'a' ? 'c' ) & 'c' & ( 'b' ? 'c' )
440
+ (1 row)
441
+
442
+ SELECT 'c ? (!a|b)'::tsquery;
443
+ tsquery
444
+ ----------------------------------
445
+ 'c' & !( 'c' ? 'a' ) | 'c' ? 'b'
446
+ (1 row)
447
+
448
+ SELECT 'c ? (!a&b)'::tsquery;
449
+ tsquery
450
+ --------------------------------------
451
+ 'c' & !( 'c' ? 'a' ) & ( 'c' ? 'b' )
452
+ (1 row)
453
+
454
+ SELECT '(a|b) ? !c'::tsquery;
455
+ tsquery
456
+ --------------------------------------------
457
+ ( 'a' | 'b' ) & !( 'a' ? 'c' | 'b' ? 'c' )
458
+ (1 row)
459
+
460
+ SELECT '(a&b) ? !c'::tsquery;
461
+ tsquery
462
+ ------------------------------------------------
463
+ 'a' & 'b' & !( ( 'a' ? 'c' ) & ( 'b' ? 'c' ) )
464
+ (1 row)
465
+
466
+ SELECT '!c ? (a|b)'::tsquery;
467
+ tsquery
468
+ ---------------------------------------------
469
+ !( 'c' ? 'a' ) & 'a' | !( 'c' ? 'b' ) & 'b'
470
+ (1 row)
471
+
472
+ SELECT '!c ? (a&b)'::tsquery;
473
+ tsquery
474
+ ---------------------------------------------
475
+ !( 'c' ? 'a' ) & 'a' & !( 'c' ? 'b' ) & 'b'
476
+ (1 row)
477
+
478
+ --comparisons
345
479
SELECT 'a' < 'b & c'::tsquery as "true";
346
480
true
347
481
------
@@ -372,6 +506,7 @@ SELECT 'a | f | g' < 'b & c'::tsquery as "false";
372
506
f
373
507
(1 row)
374
508
509
+ --concatenation
375
510
SELECT numnode( 'new'::tsquery );
376
511
numnode
377
512
---------
@@ -414,6 +549,36 @@ SELECT 'foo & bar'::tsquery && 'asd | fg';
414
549
'foo' & 'bar' & ( 'asd' | 'fg' )
415
550
(1 row)
416
551
552
+ SELECT 'a' ?? 'b & d'::tsquery;
553
+ ?column?
554
+ -------------------------------
555
+ ( 'a' ? 'b' ) & ( 'a' ? 'd' )
556
+ (1 row)
557
+
558
+ SELECT 'a & g' ?? 'b & d'::tsquery;
559
+ ?column?
560
+ ---------------------------------------------------------------
561
+ ( 'a' ? 'b' ) & ( 'g' ? 'b' ) & ( 'a' ? 'd' ) & ( 'g' ? 'd' )
562
+ (1 row)
563
+
564
+ SELECT 'a & g' ?? 'b | d'::tsquery;
565
+ ?column?
566
+ ---------------------------------------------------------------
567
+ ( 'a' ? 'b' ) & ( 'g' ? 'b' ) | ( 'a' ? 'd' ) & ( 'g' ? 'd' )
568
+ (1 row)
569
+
570
+ SELECT 'a & g' ?? 'b ? d'::tsquery;
571
+ ?column?
572
+ ---------------------------------------------------
573
+ ( 'a' ? ( 'b' ? 'd' ) ) & ( 'g' ? ( 'b' ? 'd' ) )
574
+ (1 row)
575
+
576
+ SELECT tsquery_phrase('a ?[3] g', 'b & d', 10);
577
+ tsquery_phrase
578
+ -----------------------------------------------------------------
579
+ ( ( 'a' ?[3] 'g' ) ?[10] 'b' ) & ( ( 'a' ?[3] 'g' ) ?[10] 'd' )
580
+ (1 row)
581
+
417
582
-- tsvector-tsquery operations
418
583
SELECT 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca' as "true";
419
584
true
@@ -511,6 +676,82 @@ SELECT 'supeznova supernova'::tsvector @@ 'super:*'::tsquery AS "true";
511
676
t
512
677
(1 row)
513
678
679
+ --phrase search
680
+ SELECT to_tsvector('simple', '1 2 3 1') @@ '1 ? 2' AS "true";
681
+ true
682
+ ------
683
+ t
684
+ (1 row)
685
+
686
+ SELECT to_tsvector('simple', '1 2 3 1') @@ '1 ?[2] 2' AS "true";
687
+ true
688
+ ------
689
+ t
690
+ (1 row)
691
+
692
+ SELECT to_tsvector('simple', '1 2 3 1') @@ '1 ? 3' AS "false";
693
+ false
694
+ -------
695
+ f
696
+ (1 row)
697
+
698
+ SELECT to_tsvector('simple', '1 2 3 1') @@ '1 ?[2] 3' AS "true";
699
+ true
700
+ ------
701
+ t
702
+ (1 row)
703
+
704
+
705
+ SELECT to_tsvector('simple', '1 2 11 3') @@ '1 ? 3' AS "false";
706
+ false
707
+ -------
708
+ f
709
+ (1 row)
710
+
711
+ SELECT to_tsvector('simple', '1 2 11 3') @@ '1:* ? 3' AS "true";
712
+ true
713
+ ------
714
+ t
715
+ (1 row)
716
+
717
+
718
+ SELECT to_tsvector('simple', '1 2 3 4') @@ '1 ? 2 ? 3' AS "true";
719
+ true
720
+ ------
721
+ t
722
+ (1 row)
723
+
724
+ SELECT to_tsvector('simple', '1 2 3 4') @@ '(1 ? 2) ? 3' AS "true";
725
+ true
726
+ ------
727
+ t
728
+ (1 row)
729
+
730
+ SELECT to_tsvector('simple', '1 2 3 4') @@ '1 ? (2 ? 3)' AS "false";
731
+ false
732
+ -------
733
+ f
734
+ (1 row)
735
+
736
+ SELECT to_tsvector('simple', '1 2 3 4') @@ '1 ?[2] (2 ? 3)' AS "true";
737
+ true
738
+ ------
739
+ t
740
+ (1 row)
741
+
742
+ SELECT to_tsvector('simple', '1 2 1 2 3 4') @@ '(1 ? 2) ? 3' AS "true";
743
+ true
744
+ ------
745
+ t
746
+ (1 row)
747
+
748
+ SELECT to_tsvector('simple', '1 2 1 2 3 4') @@ '1 ? 2 ? 3' AS "true";
749
+ true
750
+ ------
751
+ t
752
+ (1 row)
753
+
754
+ --ranking
514
755
SELECT ts_rank(' a:1 s:2C d g'::tsvector, 'a | s');
515
756
ts_rank
516
757
-----------
@@ -625,6 +866,66 @@ SELECT ts_rank_cd(' a:1 s:2 d g'::tsvector, 'a & s');
625
866
0.1
626
867
(1 row)
627
868
869
+ SELECT ts_rank_cd(' a:1 s:2A d g'::tsvector, 'a ? s');
870
+ ts_rank_cd
871
+ ------------
872
+ 0.181818
873
+ (1 row)
874
+
875
+ SELECT ts_rank_cd(' a:1 s:2C d g'::tsvector, 'a ? s');
876
+ ts_rank_cd
877
+ ------------
878
+ 0.133333
879
+ (1 row)
880
+
881
+ SELECT ts_rank_cd(' a:1 s:2 d g'::tsvector, 'a ? s');
882
+ ts_rank_cd
883
+ ------------
884
+ 0.1
885
+ (1 row)
886
+
887
+ SELECT ts_rank_cd(' a:1 s:2 d:2A g'::tsvector, 'a ? s');
888
+ ts_rank_cd
889
+ ------------
890
+ 0.1
891
+ (1 row)
892
+
893
+ SELECT ts_rank_cd(' a:1 s:2,3A d:2A g'::tsvector, 'a ?[2] s:A');
894
+ ts_rank_cd
895
+ ------------
896
+ 0.0909091
897
+ (1 row)
898
+
899
+ SELECT ts_rank_cd(' a:1 b:2 s:3A d:2A g'::tsvector, 'a ?[2] s:A');
900
+ ts_rank_cd
901
+ ------------
902
+ 0.0909091
903
+ (1 row)
904
+
905
+ SELECT ts_rank_cd(' a:1 sa:2D sb:2A g'::tsvector, 'a ? s:*');
906
+ ts_rank_cd
907
+ ------------
908
+ 0.1
909
+ (1 row)
910
+
911
+ SELECT ts_rank_cd(' a:1 sa:2A sb:2D g'::tsvector, 'a ? s:*');
912
+ ts_rank_cd
913
+ ------------
914
+ 0.1
915
+ (1 row)
916
+
917
+ SELECT ts_rank_cd(' a:1 sa:2A sb:2D g'::tsvector, 'a ? s:* ? sa:A');
918
+ ts_rank_cd
919
+ ------------
920
+ 0.0714286
921
+ (1 row)
922
+
923
+ SELECT ts_rank_cd(' a:1 sa:2A sb:2D g'::tsvector, 'a ? s:* ? sa:B');
924
+ ts_rank_cd
925
+ ------------
926
+ 0
927
+ (1 row)
928
+
628
929
SELECT 'a:1 b:2'::tsvector @@ 'a ? b'::tsquery AS "true";
629
930
true
630
931
------